seikin123
@seikin123 (吉田 大希)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

salesforce REST APIを使用して、なるべくAPIコールを少なく、多くのデータ更新を行う方法を教えていただきたいです。

環境

・laravel
・salesforce(顧客情報を保存する外部APIをして使用)
・Mysql(ローカル)

解決したいこと

ローカルDBから、一日一回salesforce側に、顧客情報を更新するバッチ処理を作成しています。
以下の条件で、なるべく少ないAPIコール数でsalesforceに更新をかけに行く方法を教えていただきたいです。

条件

・REST APIを使用
・親子関係のあるレコードごとに連携をしたい
・最大連携データ数700人
・使用するsalesforceのオブジェクト 7オブジェクト使用する
 (スタッフ・スキル・資格...etc)
・upsertを使う(新規追加の場合もあれば、更新を行う場合もあるので)

現状の調査結果

自分が調べた限りですと、スタッフに関連する子オブジェクトのレコードをまとめて連携しに行く方法は見つかりませんでしたので、以下のオブジェクトごとに連携する方法で進めています。

Composite API、sObject CollectionsAPIを使用する

Composite APIは、sObject CollectionsAPIを5つまで含めることができるとのことでしたので
200件x5で最大1,000件の、レコードを更新できるので一番APIコール数が少なくすむ方法かなと思っています。
・7オブジェクトに更新をかけに行くので、最大7コールで済む

懸念

更新失敗時に、親子関係の整合性が取れなくなってしまう。

salesforceドキュメント
Composite API

Sobject CollectionsAPI

参考にさせていただいた記事

わかりにくい箇所、足りない情報がありましたら、ご指摘ください

0

1Answer

私も以前の職場でdb2やMySQLデータベースのレコードをSalesforceにバッチ連携していました。その時はcurlコマンドを使ってBulk API(v1)を使ってましたよ。

データベースからのレコードをcsv形式に変換して、そのcsvを使います。
処理にはLinuxのサーバーを使っていたので、UTF-8の文字コードだったこともあり非常に楽でした。 csvの作成やSalesforceとの連携部分はシェルでバッチ処理を組みました。

Bulk APIの場合は処理結果を得るまでの時間がレコード件数によって異なることや、Salesforce側の込み具合にも影響を受けるので、何度かループして処理結果を拾う必要がある点がちょっと面倒でした。

また、Salesforce側からのエクスポートはレコード数の制限は気にしないで済みますが、Salesforce側へのインポートは1回の処理で1万件なので、1万件以上の時はcsvファイルを分割して処理する必要があります。

1Like

Comments

  1. @seikin123

    Questioner

    ご回答いただきありがとうございます。
    イメージしやすいです!

    私も以前の職場でdb2やMySQLデータベースのレコードをSalesforceにバッチ連携してい>ました。その時はcurlコマンドを使ってBulk API(v1)を使ってましたよ。
    データ量が多いと、CSVに変換して更新を行う方が最適なんですね!

    どうしても、REST APIで行いたいみたいでして、、
    その場合の最適な更新方法ってありますでしょうか。。
    可能であれば、ご教示いただきたいです。
    何卒よろしくお願いいたします。

    1オブジェクトに対して、更新レコードが最大700件と、書かせて頂いたのですが
    確認した所、大体100~200件見たいでした。

  2. REST APIにこだわる理由が分からないのですが、元々はComposite APIを使うとあるので親子の関係を維持しながら作成したいということですよね。

    少々不格好ですが、親と子の情報を持たせた移行用のオブジェクトを作ります。このオブジェクトが作成された時にフローを使って親の情報から親オブジェクトを作成して、その後に親のIdを取得して子のオブジェクトを作成します。

  3. @seikin123

    Questioner

    ありがとうございます!!

    REST APIにこだわる理由が分からないのですが、

    そうなんです、、こだわる理由がわかりません、、
    本来なら、BulkAPIで行った方が効率的でということですよね!
    同時並行で、再度提案できるようにたのんでみます!

    元々はComposite APIを使うとあるので親子の関係を維持しながら作成したいということですよね。

    おっしゃる通りで親子関係を維持して作成したいです!

    親と子の情報を持たせた移行用のオブジェクトを作ります。このオブジェクトが作成された時にフローを使って親の情報から親オブジェクトを作成して、その後に親のIdを取得して子のオブジェクトを作成します。

    なるほどです!
    親子関係のオブジェクトをsalesforceの方に作成してもらい、そのエンドポイントにcompositeAPIなどを使って、連携するという認識ですかね!
    正しく認識できていなかったら申し訳ございません、、

Your answer might help someone💌