tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:Salesforce CLI コマンドを試してみました - Part 5

Part 4 の続き。リファレンスサイトの「data Commands」から続けます。

Salesforce Developers

data Commands

データ作成や削除したりできるコマンドです。

data create record

オブジェクトや各項目の値を設定する形でデータ作成処理を実行できるコマンド。Tooling APIへの処理もできるとのこと。

// デフォルト組織の Account オブジェクトにレコードを挿入します。必須の名前フィールドのみに値があります。
sf data create record --sobject Account --values "Name=Acme"

// 2 つのフィールドの値を含む取引先レコードを挿入します。1 つの値にはスペースが含まれます。このコマンドは、エイリアス「my-scratch」を持つ組織を使用します。
sf data create record --sobject Account --values "Name='Universal Containers' Website=www.example.com" --target-org my-scratch

// Tooling API オブジェクト TraceFlag にレコードを挿入します。
sf data create record --use-tooling-api --sobject TraceFlag --values "DebugLevelId=7dl170000008U36AAE StartDate=2022-12-15T00:26:04.000+0000 ExpirationDate=2022-12-15T00:56:04.000+0000 LogType=CLASS_TRACING TracedEntityId=01p17000000R6bLAAS"


動かしてみました。


無事に取引先データを作成できました。

API名を記憶しながらサクッとコマンドを考えるのはなかなか難しそうなので利用シーンがパッとでてこないですがこういうことができる選択肢が用意されているのは良さそうです。
(一つこの後の削除コマンドの動作確認するのにデータ用意するのには役立ちました。)

data delete bulk

CSV ファイルを使用して組織からレコードを一括削除するコマンドです。
(Bulk API 2.0。)

// 「files/delete.csv」ファイル内の ID のリストを使用して、デフォルト組織から取引先レコードを一括削除します。
sf data delete bulk --sobject Account --file files/delete.csv

// エイリアス my-scratch を使用して組織内のカスタム オブジェクトからレコードを一括削除し、コマンドが完了するまで 5 分間待ちます。
sf data delete bulk --sobject MyObject__c --file files/delete.csv --wait 5 --target-org my-scratch


試して見るにあたり、先程のcreateコマンドで取引先レコードを作成。レコードIDを取得します。


プロジェクトのディレクトリ内に「files」ディレクトリを作成。(実際はこんな名前で管理しないと思うけど今回は動作確認用にこの名前で進めます。)


delete.csvファイルを作成。CSVの作り方としては「CSV ファイルには 1 つの列 (「Id」) のみが必要で、その後に削除するレコード ID のリストが 1 行に 1 つずつ含まれている必要があります。」となっていました。

※ヘッダーのIdも記載する必要があるようです。


コマンドを実行してみます。

sf data delete bulk --sobject Account --file files/delete.csv


正常に実行できることを確認できました。


コマンド実行結果のsuccessfullyは処理開始ができれば表示されます。試して見るときはデータ削除が成功したかまでをチェックすると良さそうです。

data delete record

レコード削除が実行できるコマンドです。

// 指定された (切り捨てられた) ID を持つレコードをアカウントから削除します。
sf data delete record --sobject Account --record-id 00180XX

// 名前が「Acme」に等しいアカウントからレコードを削除します。
sf data delete record --sobject Account --where "Name=Acme"

// 2 つのフィールド値 (スペースを含むフィールド値) で識別されるアカウントからレコードを削除します。このコマンドは、エイリアス「my-scratch」を持つ組織を使用します。
sf data delete record --sobject Account --where "Name='Universal Containers' Phone='(123) 456-7890'" --target-org myscratch

// 指定された (切り捨てられた) ID を持つレコードを Tooling API オブジェクト TraceFlag から削除します。
sf data delete record --use-tooling-api --sobject TraceFlag --record-id 7tf8c


コマンド実行試してみました。

sf data delete record --sobject Account --record-id 0015j0000179gXiAAI


成功メッセージが表示されて削除できました。

data delete resume

以前に開始した一括削除ジョブを再開するコマンド。「sf data deleteBulk」コマンドまたは最後に実行された一括削除ジョブによって返されたジョブ ID を使用するとのこと。

// ID を使用してデフォルト組織から一括削除ジョブを再開します。
sf data delete resume --job-id 750xx000000005sAAA

// エイリアス my-scratch を使用して、組織に対して最後に実行した一括削除ジョブを再開します。
sf data delete resume --use-most-recent --target-org my-scratch


これはこういうコマンドがあるということで省略。

data export tree

組織から 1 つ以上の JSON ファイルにデータをエクスポートできるコマンドです。

// 指定した SOQL クエリで取得したレコードを現在のディレクトリ内の単一の JSON ファイルにエクスポートします。このコマンドはデフォルトの組織を使用します。
sf data export tree --query "SELECT Id, Name, (SELECT Name, Address__c FROM Properties__r) FROM Broker__c"

// 「query.txt」ファイルの SOQL クエリを使用してデータをエクスポートし、オブジェクトごとに JSON ファイルとそれらを集約するプランを生成します。
sf data export tree --query query.txt --plan

// 生成される各ファイルの前に「export-demo」を追加し、「export-out」ディレクトリにファイルを生成します。組織上でエイリアス「my-scratch」を使用してコマンドを実行します。
sf data export tree --query query.txt --plan --prefix export-demo --output-dir export-out --target-org my-scratch


コマンド実行試してみます。

sf data export tree --query "SELECT Id, Name  FROM Account"


実行したディレクトリにAccount.jsonファイルが作成されました。取得したデータはJSON形式で記録されるみたいです。
(作成位置を指定したい場合は「 --output-dir」を指定。)


もう一つ試してみます。query.textを使う方法。本来はちゃんとフォルダ作ってそこにファイルを配置するべきですが、今回は何も考えずにトップに配置。


次のコマンドを実行。

sf data export tree --query query.txt --plan --prefix export-demo --output-dir export-out --target-org sfdc-my-playground


ファイルはもう一種類作成されました。とりあえずdata exportはこんな感じのようです。

data get record

Salesforce または Tooling API オブジェクトの単一レコードを取得して表示するコマンドです。

// 指定された (切り捨てられた) ID を持つアカウントからレコードを取得して表示します。
sf data get record --sobject Account --record-id 00180XX

// 名前が「Acme」に等しいアカウントからレコードを取得します。
sf data get record --sobject Account --where "Name=Acme"

// 2 つのフィールド値で識別される Account からレコードを取得します。1 つはスペースを含みます。このコマンドは、エイリアス「my-scratch」を持つ組織を使用します。
sf data get record --sobject Account --where "Name='Universal Containers' Phone='(123) 456-7890'" --target-org myscratch

// 指定された (切り捨てられた) ID を持つレコードを Tooling API オブジェクト TraceFlag から取得します。
sf data get record --use-tooling-api --sobject TraceFlag --record-id 7tf8c


コマンド試してみました。ターミナル上に結果が表示されます。

sf data get record --sobject Account --record-id 0015j000015ChfvAAC

data import tree

1 つ以上の JSON ファイルから組織にデータをインポートします。(sObject Tree API は、最大 200 レコードを含むリクエストをサポートするとのことです。)

// 2 つの JSON ファイルに含まれるレコードを、エイリアス「my-scratch」を使用して組織にインポートします。
sf data import tree --files Contact.json,Account.json --target-org my-scratch

// プラン定義ファイルを使用してレコードをデフォルト組織にインポートします。
sf data import tree --plan Account-Contact-plan.json


コマンド実行を試してみました。

sf data import tree --files export-out/export-demo-Accounts.json --target-org sfdc-my-playground


exportコマンドで生成したJSONファイルが丁度良さそうなので試してみます。


コマンドは正常実行できました。


こんな感じで取引先が作成できました。スクラッチ組織作成後のサンプルデータ作成時のコマンドとして便利そうです。(本番実行しないように注意は必要。target-orgを指定するのを忘れない。)

data query

SOQL クエリを実行できるコマンドです。

// コマンドラインで SOQL クエリを指定します。このコマンドはデフォルトの組織を使用します。
sf data query --query "SELECT Id, Name, Account.Name FROM Contact"

// 「query.txt」というファイルから SOQL クエリを読み取ります。このコマンドは、エイリアス「my-scratch」を持つ組織を使用します。
sf data query --file query.txt --target-org my-scratch

// Tooling API を使用して、ApexTrigger Tooling API オブジェクトに対してクエリを実行します。
sf data query --query "SELECT Name FROM ApexTrigger" --use-tooling-api

// Bulk API 2.0 を使用して、多くの行を返すクエリを実行し、すぐに制御をターミナルに返します。
sf data query --query "SELECT Id FROM Contact" --bulk --wait 0


コマンド実行試してみました。想像通りに動作するシンプルなコマンドでした。


もうひとつ、bulkの方も試してみました。非同期処理なので実行成功のメッセージのみ表示されました。(結果取得は別のコマンドで行います。)

data query resume

一括クエリのステータスを表示します。「sf data query --bulk」コマンドから返されたジョブ ID を使用して、このコマンドを実行します。とのことです。

// 指定された ID を持つ一括クエリのステータスを表示します。
sf data query resume --bulk-query-id 7500x000005BdFzXXX


コマンド試してみます。

sf data query resume --bulk-query-id 7505j00000FwDgpAAF


このようにdata query のbulk 実行の結果を表示できました。bulk実行→しばらくしてからresumeコマンドで結果取得という流れのようです。

data update record

Salesforce または Tooling API オブジェクトの単一レコードを更新するコマンドです。

// 指定された (切り捨てられた) ID で取引先レコードの [名前] フィールドを更新します。
sf data update record --sobject Account --record-id 001D0 --values "Name=NewAcme"

// 現在の名前が「Old Acme」である取引先レコードの名前フィールドを更新します。
sf data update record --sobject Account --where "Name='Old Acme'" --values "Name='New Acme'"

// アカウント レコードの [名前] フィールドと [Web サイト] フィールドを、指定された (切り捨てられた) ID で更新します。
sf data update record --sobject Account --record-id 001D0 --values "Name='Acme III' Website=www.example.com"

// 指定された (切り捨てられた) ID を使用して、Tooling API オブジェクト TraceFlag のレコードの ExpirationDate フィールドを更新します。
sf data update record -t --sobject TraceFlag --record-id 7tf170000009cUBAAY --values "ExpirationDate=2017-12-01T00:58:04.000+0000"


コマンド実行試してみます。

sf data update record --sobject Account --record-id 0015j000015ChfvAAC --values "Name=sForce★"

無事に更新できました。

data upsert bulk

CSV ファイルから組織にレコードを一括更新/挿入します。Bulk API 2.0を使用します。とのことです。

// デフォルト組織の取引先責任者オブジェクトにレコードを一括更新/挿入します。
sf data upsert bulk --sobject Contact --file files/contacts.csv --external-id Id

// エイリアス my-scratch を使用して組織内のカスタム オブジェクトにレコードを一括更新/挿入し、コマンドが完了するまで 5 分間待ちます。
sf data upsert bulk --sobject MyObject__c --file files/file.csv --external-id MyField__c --wait 5 --target-org my-scratch


他のコマンドで似たような感じだったのでお試し実行はスキップします。

data upsert resume

以前に開始した一括更新/挿入ジョブを再開します。Bulk API 2.0を使用します。とのことです。

// ID を使用してデフォルト組織から一括更新/挿入ジョブを再開します。
sf data upsert resume --job-id 750xx000000005sAAA

// エイリアス my-scratch を使用して、組織に対して最後に実行した一括更新/挿入ジョブを再開します。
sf data upsert resume --use-most-recent --target-org my-scratch


こちらもコマンド実行は省略。Bulkで実行された結果を取得するには resumeコマンドを使うと覚えておけば良さそうです。

Part 5 のまとめ

「data Commands」だけでけっこうなボリュームになったので今回はここまで。利用シーンは限定される気がしますがCSVやJSONファイルで一括操作できるのは覚えておくとSandboxやスクラッチ組織の環境構築が効率良くできそうな気がしましました。(ただ、Sandboxの環境構築なら個人的にはSandbox組織でのみ実行可能な制御を入れたApex処理を用意するほうが良い気はしてます。)


エクスポート→ファイル出力も結構便利そう。データローダで類似の実現はできますが、決まった条件で定期的に実行するならコマンド実行でマニュアル化したほうが良さそうかもと思いました。


少なくてもこういう選択肢があるといくことは覚えておいて損はないかなと思います。