技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

スクラッチ組織のセットアップ時にレコードを CSV で設定できるようにするプラグイン

やりたいこと

クラッチ組織で開発するとき、テスト用の初期設定データセットアップがめんどくさいから自動化したい。

sfdx の既存コマンドで満足できない

sfdx には正式なコマンドとして force:data:tree が存在するが、このコマンドは JSON を取り込む一方、その方法は SOQL で取得したものを設定する というもの。
SOQL の制限がつくので、あまり複雑なレコード構成ができない…(4階層とか4階層とかリレーションがあるものなど)

どうしたい?

ROR の migrate とかそれに近いことがしたい。
しかし salesforce は insert / update / delete はSQLのような構文式ではないので、ここは諦めて CSV で書きたい。

作ったもの

なのでこんなもの作ってみた。

github.com

インストール

  1. とりあえず clone してきます
  2. ディレクトリに入って yarn && yarn build コマンドを入力します
  3. sf plugins link . を入力すればOK準備できました

使い方

サンプルスキーマ

とりあえずサンプルのカスタムオブジェクトを用意します。

基本操作

  1. この組織に認証します(スクラッチ組織を作ってるなら認証はしているはず)
  2. 適当なディレクトリ(デフォルトは data)を作って、次のルールでCSVファイルを作ります。
    • [連番]_[アクション]_[オブジェクト名].csv
    • 連番は 1 から始まる数字で、重複禁止。欠番したらそれ以降は処理されません。
    • アクションは insert, update, delete のいずれか。
    • オブジェクト名はオブジェクト API 名が指定されます。
  3. CSV (UTF-8 で指定)の中身は、1行目が項目のAPI名と型を指定し、2行目以降がデータです。
    • 1行目項目の書式は [項目API名]([型]) です。型には次の値が指定できます。ただし、Id 項目だけは型指定しないでください(プライマリキー扱いになるので)。
      • ref(参照、主従関係等Id参照)
      • bool(チェックボックス)
      • num(数値、金額等)
      • per(パーセント)
      • date(日付。yyyy-MM-dd書式)
      • time(時刻型。HH:mm:ss.sssZ書式)
      • datetime(日時型。yyyy-MM-ddTHH:mm(timezone) 書式で、例えば日本時間の23/4/16 午前9時なら 2023-04-16T09:00+09:00)
    • Id 項目は実際のID項目ではなく、このインポート操作中のユニークな名称を指定します(この項目だけは、型指定が不要です。)。

サンプル

例えば、こんな構成でファイルを作成します。

  • data
    • 1_insert_Account.csv
    • 2_insert_Sample__c.csv
    • 3_update_Sample__c.csv

それぞれの中身は

1_insert_Account.csv

取引先を2件 insert します。

Id,Name(text),Phone(text)
AccountId1,TestAccount01,09011111111
AccountId2,TestAccount02,09022222222

2_insert_Sample__c.csv

Sample__c (前述したサンプルスキーマ)に1行追記します。
尚、空欄項目は null 扱いになります

Id,Name(text),Account__c(ref),checkboxField__c(bool),dateField__c(date),datetimeField__c(datetime),numberField__c(num),percent__c(per),textField__c(text),timeField__c(time)
Sample01,Sample01,AccountId2,true,2023-04-16,2023-04-16T09:00+09:00,24.9,56,Welcome plugin!,09:00:00.000Z

3_update_Sample__c.csv

Sample__cSample01 に、AccountId2 で指定した取引先を割り当てます。
2 に入れてしまってもいいですが、更新のサンプルです。

Id,Account__c(ref)
Sample01,AccountId2

実行サンプル

コマンドとして次のようにお入力します。
因みに、data ディレクトリに csv がある場合は -d は省略できます。

$  azalea data apply -u test-9hmhkijjmr5y@example.com -d data

実行後のレコード状態はこんな感じです。

免責

自分が使う規模のことしか考えてません。
あまりに巨大なデータやCSVを扱う、ガバナ制限の対処、例外発生時のトランザクションなどは一切考慮していませんのでお気をつけください。