3.5.2 カスタムテーブルのレコードのインポート

データモデルアプリケーションの[インポート]タブについて説明します。
[インポート]タブでは、Ops Iの導入時などにカスタムテーブルのレコードが記載されたCSVファイルからレコードを一括でインポートし、新規作成、更新ができます。
インポートするジョブのことを、ここではインポートジョブと呼びます。 [インポート]タブを利用するには、Primitiveロール「resource_importer」が付与されている必要があります。
また、インポートするには事前にImportのYAMLファイルを登録する必要があります。ImportのYAMLファイルの詳細は「Import」を参照してください。


(1)インポートジョブ一覧画面

[インポート]タブをクリックするとインポートジョブ一覧画面が表示されます。
インポートジョブ一覧画面ではインポートの状況を確認し、エラーがあればその原因であるCSVファイルの行を特定できます。
登録済みのカスタムテーブルのレコードは、[カスタムデータモデル]タブから確認できます。詳細は「カスタムデータモデル」を参照してください。

インポートジョブ一覧画面は、[インポート]ボタン、[削除]ボタン、インポートジョブ一覧で構成されます。詳細は、以下に示します。

(表)インポートジョブ一覧画面の構成

構成要素 説明
[インポート]ボタン クリックすると、ファイルアップロード画面が表示されます。
詳細は、「ファイルアップロード画面」を参照してください。
[削除]ボタン インポートジョブを削除します。
インポートジョブ一覧のチェックボックスにチェックをした項目がある場合に活性化し、クリックすると削除確認ダイアログが表示されます。削除確認ダイアログで「確認しました」チェックボックスにチェックをし、[OK]ボタンをクリックすると、選択していたインポートジョブが削除されます。ただし、ステータスがsucceededまたはerrorのインポートジョブのみ削除できます。
インポートジョブ一覧 インポートジョブの詳細が一覧で表示されます。
表示される項目は次の通りです。
  • チェックボックス:インポートジョブの削除に使用
  • ジョブID:インポートジョブのIDを表示
  • リソースタイプ:インポートしたリソースタイプ(group、role、customer、custom-dataのいずれか)を表示
    Primitiveロール「user_admin」が付与されていない場合、リソースタイプがcustom-dataであるインポートジョブのみが表示されます。
  • インポート定義名:インポート時に指定したインポートの定義名
  • ファイル名:アップロードしたCSVファイル名を表示
  • 成功行数:インポートに成功した行数を表示
  • エラー行数:インポートに失敗した行数を表示
    クリックすると、エラー結果が記載されたCSVファイルをダウンロードします。
  • 合計行数:成功行数とエラー行数を合計した値を表示
  • ステータス:インポートの進捗を表示
    表示されるステータスは次の通りです。
    • accepted:処理待ち
      インポートジョブがシステムに受け付けられ、処理を待っている状態です。
    • processing:処理中
      インポートジョブを処理している状態です。CSVファイルの各行を順番に処理します。
    • succeeded:正常に完了
      すべてのレコードが正常にインポートされた状態です。
    • error:エラー
      インポートジョブが完了しましたが、一部の行でエラーが発生している状態です。エラーが発生した行の詳細を確認できます。
  • 作成者:インポートを実行したユーザーを表示
  • 作成日時:インポートを実行した時刻を表示(YYYY-MM-DD hh:mm:ss ±hh:mm
  • 終了日時:インポートが終了した時刻を表示(YYYY-MM-DD hh:mm:ss ±hh:mm

(2)ファイルアップロード画面

インポートジョブ一覧画面で[インポート]ボタンをクリックすると、ファイルアップロード画面が表示されます。
ファイルアップロード画面ではインポート定義を指定し、ファイルをアップロードすることで、カスタムテーブルをインポートできます。

ファイルアップロード画面は[インポート開始]ボタン、[キャンセル]ボタン、インポート定義、ファイルアップロードエリアで構成されます。詳細は、以下に示します。

(表)ファイルアップロード画面の構成

構成要素 説明
[インポート開始]ボタン クリックすると、ファイルアップロードエリアでアップロードしたCSVファイルのレコードを、インポート定義で選択した形式でインポートします。インポート定義で選択されていない、またはインポートファイルアップロードエリアにファイルがアップロードされていない場合、活性化されません。
[キャンセル]ボタン クリックするとインポートを実行せずに、インポートジョブ一覧画面が表示されます。
インポート定義 インポートの定義を選択します。検索アイコンをクリックすると、[インポート定義]ダイアログが表示され、任意のインポートの定義を選択したうえで[OK]ボタンをクリックすると、[インポート定義]ダイアログが閉じ、選択した値が入力されます。表示されるインポートの定義は事前にImportのYAMLファイルで定義する必要があります。ImportのYAMLファイルのnameまたはlabelラベルには、インポート先のテーブルがわかるような名称を設定してください。詳細は「カスタムテーブルのレコードのインポート」を参照してください。
ファイルアップロードエリア インポートするカスタムテーブルのレコードが記載されたCSVファイルをアップロードします。
「追加するファイルをドロップまたは選択してください」の「選択」のリンクをクリックすると、ファイル操作ダイアログが表示されます。ファイル操作ダイアログから選択、または点線内の領域にCSVファイルをドロップしてアップロードしてください。複数のCSVファイルを同時にアップロードすることはできません。アップロードできるファイルは以下の通りです。
  • ファイルサイズが100MB以下
  • 文字コードがUTF-8(BOMなし)
100MBを超えるCSVファイルを選択すると、エラーメッセージが出力され、インポートは実行されません。

CSVファイルは1行目にデータ項目をカンマ(,)で区切って入力し、2行目からインポートする値を1行目と同じ順番になるようにカンマ(,)で区切って入力してください。
1つのデータ項目に複数の値を指定する場合、セミコロン(;)で区切ってください。

カスタムテーブルのレコードのインポートでは、インポート時の条件によってインポート時の動作が変わります。
CSVファイルとカスタムテーブルがマッピングされている場合、CSVファイルのレコードがカスタムテーブルに反映されます。
CSVファイルとカスタムテーブルがマッピングされていない場合、以下の条件によって反映されるレコードが異なります。

  • レコードの新規作成か更新か
  • Ops Iのデフォルトのカラムかユーザーが作成したカラムか

上記の条件の組み合わせと動作は次の表のとおりです。

(表)インポート時の動作

レコードの動作※1 デフォルトのカラムか※2 動作
新規作成 Yes 以下の値が設定される。
  • id、created_on、updated_on:自動設定
  • created_by、updated_by:インポートジョブの作成者
  • sys_customer:null
No nullが設定される。ただし、DatamodelのYAMLファイルのnot-nullラベルがtrueに設定されたカラムの場合、エラーとなる。また、デフォルト値が設定されている場合、デフォルト値が入る。
更新 Yes 以下の値で更新される。
  • updated_on:自動更新
  • updated_by:インポートジョブの作成者
id、created_on、created_by、sys_customerは更新されない。
No 更新されない。
※1:ImportのYAMLファイルのcoalesceラベルがtrueに設定されたカラムで、CSVファイルと同じ値のレコードがカスタムテーブルにある場合、レコードは更新されます。それ以外の場合、レコードは新規作成されます。
※2:デフォルトで用意されているカラムのうち、インポートできるのは次の通りです。
id、created_on、updated_on、created_by、updated_by、sys_customer

注意事項注意事項

Ops Iのカスタムテーブルでは、各レコードのidの値がテーブル内で一意である必要がありますが、idを含むレコードをインポートする場合、idが重複したレコードが登録されるおそれがあるという問題があります。idを含めたレコードをインポートする場合は、idのみを一意識別子(coalesce: true)として設定することで、この問題を回避できます。


メモメモ
Ops Iのカスタムテーブルから取得したレコードを別のOps Iにインポートする場合、idを一意識別子(coalesce: true)として設定することを推奨します。
それ以外の場合は、CSVファイルの中で適切なレコードを一意識別子に設定し、columnMappingsのtargetにはidを設定しないことを推奨します。targetにidを設定しない場合、Ops I内で一意となる値がidに自動的に設定されます。

カスタムテーブルのレコードをインポートする際、DatamodelのYAMLファイルのカラムのタイプに対応するCSVファイルのデータの形式は次の通りです。DatamodelのYAMLファイルのカラムタイプの詳細は「(表)カラムのタイプ」を参照してください。

(表)DatamodelのYAMLファイルのカラムのタイプに対応するCSVファイルのデータの形式

DatamodelのYAMLファイルのカラムのタイプ CSVファイルのデータの形式
integer 整数
numeric 小数点を含む数字
varchar 文字列
デフォルトの文字列の最大長は40文字です。「varchar(文字数)」と指定することで、文字列の最大長を変更できます。指定できる文字列の最大長は10,485,760文字です。
text 文字列
timestamp YYYY-MM-DDThh:mm:ss±hh:mmの形式
例)2026-01-05T14:30:00+09:00
date 次のいずれかの形式
  • YYYY-MM-DD
  • YYYY-MM-DDThh:mm:ss±hh:mm
YYYY-MM-DDThh:mm:ss±hh:mmの形式で入力した場合、YYYY-MM-DDの形式に変換されます。
例)2026-01-05
time hh:mm:ssの形式
例)14:30:00
boolean trueまたはfalse
enum DatamodelのYAMLファイルで定義された形式
inet CIDR(IPv4)の形式
例)192.168.1.1
decimal 小数点を含む数字
uuid XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXの形式
「X」には半角英数字(a~f 0~9)が入ります。
例)550e8400-e29b-41d4-a716-446655440000
メモメモ
RFC9562(バージョン:1~8)に準拠したuuidを使用してください。

<記載例>
DatamodelのYAMLファイル、ImportのYAMLファイル、CSVファイルの記載例は次の通りです。

■DatamodelのYAMLファイル

---
apiVersion: 1.0
kind: datamodel

type: resource
name: device_request_datamodel
label: device_request_datamodel
description: device_request_datamodel

tables:
  - name: device_request_table
    label: device_request_table
    columns:
      - name: title
        label: タイトル
        type: varchar
      - name: device_type
        label: 機器種別
        type: enum
        enum:
          - name: company_cell_phone
            label: 社用携帯
          - name: tablet
            label: タブレット端末
          - name: note_pc
            label: ノートPC
          - name: desktop_pc
            label: デスクトップPC
      - name: num_request
        label: 個数
        type: integer
        default: 1
      - name: request_date_time
        label: 申請日時
        type: timestamp
      - name: note
        label: 備考
        type: text

■ImportのYAMLファイル

---
apiVersion: 1.0
kind: import

type: resource
name: device_request_import
label: 機器申請データインポート
description: device_request_tableへのデータインポート定義

includes:
  - kind: datamodel
    name: device_request_datamodel

# インポート先テーブル名
targetTable: device_request_table

# CSVカラムとDBカラムのマッピング
columnMappings:
  # 一意識別子(既存レコード検索用キー)
  - source: id
    target: id
    coalesce: true

  # タイトル(最大255文字)
  - source: title
    target: title
    validation:
      format: regex
      pattern: ^.{1,255}$

  # 機器種別
  - source: device_type
    target: device_type

  # 申請個数(1-999の整数)
  - source: num_request
    target: num_request
    validation:
      format: regex
      pattern: ^[1-9][0-9]{0,2}$

  # 申請日時(任意)
  - source: request_date_time
    target: request_date_time

  # 備考(任意、バリデーションなし)
  - source: note
    target: note

■CSVファイル

id,title,device_type,num_request,request_date_time,note
550e8400-e29b-41d4-a716-446655440000,ノートPCの申請,note_pc,1,2026-02-10 09:00:00,開発用ノートPCが必要
6ba7b810-9dad-11d1-80b4-00c04fd430c8,社用携帯の申請,company_cell_phone,2,2026-02-10 10:30:00,営業部門用に2台
7c9e6679-7425-40de-944b-e07fc1f90ae7,タブレット端末の申請,tablet,3,2026-02-11 14:15:00,現場作業用
8f9e6679-8536-41ef-a55c-f18ed2f90bf8,デスクトップPCの追加申請,desktop_pc,1,2026-02-11 16:45:00,設計部門の増員対応