Salesforceにデータを連携するアプリケーションをRailsで開発した際にデータの更新数が問題になった。
SalesforceのAPIを叩いて更新するわけだがAPIの実行回数の上限は、
ベースが24時間あたり,15,000回。
システムのユーザーは現状500人程度だが毎月一人当たり30レコードが生成されるので、1レコードづつSOQLでAPI経由で更新していると現状でも15,000回に達してしまう!
そこでBulk API!
SOAP APIでログインして、ジョブを作成して更新したいデータをcsvでアップロードする、か、、面倒だな。。
と思っていたらgemがあった。salesforce_bulk_api
Restforceの認証を流用しているので移行も楽そう。
Update
@client = Restforce.new
@client.authenticate!
sf = SalesforceBulkApi::Api.new(@client)
# obj_name: SF側の更新対象オブジェクト。
# update_data: 反映するデータ。Hashの配列
sf.update(obj_name, update_data)
NULLデータの反映
Bulk APIではNULLや空文字列でフィールドの更新はしてくれないらしい。。NULLにしたいときは #N/A
を使えと。。また面倒な。
salesforce_bulk_apiの update
メソッドでは、第4引数をtrueにすると、NULL値への更新ができるようになる。
sf.update(obj_name, update_data, false, true)
エラーメッセージの取得
Bulk APIは非同期で実行されるのでデフォルトでは、
SF側での実行結果は取得できない。update
メソッドだと第3引数をtrueにすると、
同期処理になってレスポンスでエラー結果が取得できる。
@client = Restforce.new
@client.authenticate!
sf = SalesforceBulkApi::Api.new(@client)
# obj_name: SF側の更新対象オブジェクト。
# update_data: 反映するデータ。Hashの配列
res = sf.update(obj_name, update_data, true, true)
Rails.logger.error resp['batches'].first.['response'].first['errors']