ということでデータローダ作りました。Salesforce Dataloaderができる基本的な機能は踏襲しつつYet Another感出してみました。
あ、この記事は Trailblazer Advent Calendar 2018 第20日目の記事となります。コンセプト
- 本家より簡単に使えるCLIツールを作る
- クロスプラットフォーム対応
- かゆいところに手が届く
- Excel、JSON、JSONL、YAML、TSV対応(固定長も対応予定)
- INIファイルではなくYAMLでマッピング
- エクスポート時のSOQLでワイルドカードが使える
インストール方法
Linux, macOS向け$ curl -sL http://install.freedom-man.com/yasd.sh | bash
Windowsユーザ向け(コマンドプロンプトで以下を入力)
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile ^
-InputFormat None -ExecutionPolicy Bypass ^
-Command "iex ((New-Object System.Net.WebClient).DownloadString('http://install.freedom-man.com/yasd.ps1'))" ^
&& SET "PATH=%PATH%;%APPDATA%\yasd\bin"
goユーザ向け
$ go get github.com/tzmfreedom/yasd
使い方
クレデンシャルの指定方法は環境変数か、オプション引数で指定します。パスワードは暗号化したものでもOK(後述) --username value, -u value [$SALESFORCE_USERNAME]
--password value, -p value [$SALESFORCE_PASSWORD]
--endpoint value, -e value (default: "login.salesforce.com") [$SALESFORCE_ENDPOINT]
各コマンドはこんな感じでいけます↓
EXPORT
SOQLを使ってSalesforceからデータを取り出します。SELECT句にワイルドカードも指定可能です。$ yasd export -q "SELECT * FROM Account"
--query value, -q value
--batch-size value (default: 500)
--file value
--format value
--sheet value (default: "import")
formatはcsv, tsv, jsonl, json, yaml, xlsx から選択します。
INSERT/UPDATE/DELETE/UNDELETE
ファイルからレコードの作成・更新・削除・復元をします。マッピングファイルはYAMLを使います。以下、insertの例です。$ yasd insert -t Account -f /path/to/import.csv --mapping /path/to/mapping.yml
--mapping value
--debug, -d
--key value
--file value, -f value
--type value, -t value
--mode value
--sheet value (default: "import")
--success-file value (default: "./success.csv")
--error-file value (default: "./error.csv")
--insert-nulls
typeにはオブジェクトのAPI参照名を入れます。fileに指定したファイル名の拡張子をもとに良い感じにファイルを読み取ります。
拡張子は csv, tsv, xlsx, json, jsonl, yaml, dat(固定長)が対応しています。
mappingが指定されていなければヘッダ名をAPI参照名としてインポートします。
mappingのYAMLはこんな感じで指定します↓
名前: Name
住所: Address__c
mappingに定義されていない項目はヘッダ名をAPI参照名として扱います。
UPSERT
文字通りupsertします$ yasd insert -t Account -f /path/to/import.csv --mapping /path/to/mapping.yml --upsert-key ExKey__c
他のDMLのオプションに加えて –upsert-key
を指定します。
パスワードの暗号化
パスワードを暗号化して、暗号化したパスワードを使ってコマンドを起動できます。$ yasd generate-key > /path/to/key # 暗号化キーを生成
$ yasd encrypt --key /path/to/key # 暗号化キーを使ってパスワードを暗号化し、標準出力に暗号化したパスワードを出力
# 対話式でパスワード入力
$ yasd export -q "SELECT * FROM Account" -u xxx@xxx.xxx -p {暗号化したパスワード} --key /path/to/key
暗号化したパスワードを使う場合は各コマンドで –key
オプションを指定します。
Excelファイルの操作
insert例$ yasd insert -t Account -f /path/to/file.xlsx --sheet {シート名}
export例
$ yasd export -q "SELECT * FROM Account" --sheet {シート名} --format xlsx --file test.xlsx
テクニカルなところ
- クロスプラットフォームでシングルバイナリが簡単に作れるGolangを採用
- CLIフレームワークは定番(?)のurfave/cli
- このためにSalesforce SOAP APIのGolangクライアントを作った
- ワイルドカード表現はかなり手抜きして正規表現で置き換え
追加予定の機能(気が乗ったら)
- バルクAPI対応
- タイムゾーン対応(T00:00:00.000Zを自動付与するとか)
- プロキシ対応
- リトライのハンドリングとか
ということでYet AnotherなSalesforce Dataloaderの紹介でした〜
ご要望あればissueなりプルリクなり上げてもらえれば👍