CData Arc - Salesforce へのUpsert をバッチで実行する方法

by 色川穂高 | 2022年09月28日

 
こんにちは。CData Software Japan の色川です。
 
この記事ではCData Arc で、Salesforce へのUpsert をバッチで実行する方法を紹介します。
 
Upsert やバッチという単語は、幾つかの異なる意味や機能として出てきますので、最初に何点か関連するポイントをご紹介していきます。
 

CData Arc のUpsert 機能

250 を超えるデータソースへの接続を実現するCData Drivers をシームレスに利用できるCData コネクタをはじめ、CData Arc のデータベース系コネクタではUpsert の機能を備えています。
 
 
 
このCData Arc のレイヤで提供しているUpsert 機能は、レコード単位に指定したkey で既にデータが存在していれば更新(Update)なければ追加(Insert)の処理を、Arc のコネクタで実行してくれる便利な機能です。Upsert のAPI が用意されているSaaS は限られており、Upsert API の無いSaaS に対して既存データの有無に依って処理を分けてくれるCData Arc のUpsert 機能は重宝します。ただ「指定したkey でSelect を実行して、その結果に応じてUpdate もしくはInsert を実行する」という仕組み上、この機構では1レコードずつ処理され、SaaS へのAPI リクエストもその応分実施されます。
 
 

CData Salesforce Driver でのUpsert

SaaS の中でも人気の高いSalesforce ではUpsert のAPI が提供されており、もちろんCData Salesforce Driver もUpsert API に対応しています。
 
 
 
CData Salesforce Driver でのUpsert 対応については、こちらの記事も参考にしてください。
 
 
 
大規模に利用されることの多いSaaS の代表格とも言えるSalesforce では、大量のデータを一括処理するための機構も充実しています。同期型のSOAP API において単一レコードでなく複数レコードを一括で処理するバッチの機構や、処理自体を非同期でまとめて依頼するBulk API など、それぞれある程度のデータ量を連携する必要がある場合は活用が必須になる機能だと思います。もちろんCData Salesforce Driver はどちらの機構にも対応しています。
 
 
 
 

CData Arc でのバッチ処理(Insert/Update)

次に、こちらの記事でご紹介しているように、CData Arc ではデータソースが対応していれば(≒ 対象のデータソース接続で利用するCData Drivers が対応していれば)複数レコードの一括処理(一括追加または一括更新)は、バッチインプットサイズを指定することで対応することができます。
 
 
ただし、この機構はInsert やUpdate の場合に限られます。Salesforce のUpsert API を利用したバッチ処理(複数レコードを一括Upsert)は、この方法では行うことができません。
 
ここまではこの記事の前フリと言えますが、ここまででご紹介した内容を少し整理します。
 
  • CData Arc のコネクタレベルで提供されるUpsert 機能(Select した結果でInsert かUpdate を自動で判断・実行する機能)は連携フローの作成において非常に便利ですが、複数レコードを一括処理することはできません。一定量のデータを処理する必要がある時や、API コール数をシビアにコントロールしたい場合は、複数レコードを一括処理する機構を利用したくなると思います。
  • Salesforce ではAPI としてUpsert が用意されており、CData Salesforce Driver ではUpsert API に対応しています。CData Salesforce Driver ではInsert/Update だけでなくUpsert においても複数レコードを一括処理するバッチの機構に対応しています。同期SOAP API だけでなく非同期Bulk API も利用可能です。
  • CData Arc は(CData Drivers が対応していれば)Insert やUpdate において複数レコードを一括処理するバッチの機構を、バッチインプットサイズを指定することで簡単に利用することができます。ただしUpsert はこの方法が使えません。


CData Arc で、Salesforce へのUpsert をバッチで実行する方法

少し長い前フリになりましたが、ここからこの記事の本題です。

 

CData Arc のSalesforce コネクタは、CData Salesforce Driver を便利な機能とUI を付けてラップしたコネクタです。CData Salesforce Driver が持つ機能価値はCData Arc でも利用することができます。

Salesforce へのUpsert をバッチで実行する(複数レコードを一括Upsert する)場合は、以下の流れのように設定してください。

 

基本的な考え方

考え方としては「CData Salesforce Driver 側が備える複数レコードを一括処理するためのSQL 構文(一時テーブルを利用する機構)」を「CData Arc のSalesforce コネクタでカスタムマッピングとして指定する」ことで実現します。

具体的には「一時テーブル(#TEMP)へのInsert、一時テーブルをソースとしたUpsert Into Select、2つのクエリを実行」する必要がありますが、これを「CData Arc のSalesforce コネクタが備えるPre-Processing and Post-Processing Queries」の機構を利用して実現します。

 

 
 

対象オブジェクトの構成

以下の例は、標準オブジェクトの商品(Product2)に外部キーとして「External_key(External_key__c)」の項目を追加構成した状態で、「Name, ProductCode, External_key__c」の項目を指定してUpsert を行う場合のSalesforce コネクタの設定例です。
 
 
 

Salesforce コネクタの設定

Salesforce コネクタのアクションをUpsert に設定し、Product2 オブジェクトを選択して保存します。
 
 
Update 設定をコードモードで開き、以下のように編集します。
 
 
 
<Items>
  <Product2 table="Product2" insertQuery="INSERT INTO Product2#TEMP (Name, ProductCode, External_key__c, ExternalIdColumn) VALUES (@Name, @ProductCode, @External_key__c, 'External_key__c')">
    <Name />
    <ProductCode />
    <External_key__c />
    <ExternalIdColumn />
  </Product2>
  <UPSERTProduct2 table="Product2" insertQuery="UPSERT INTO Product2 (Name, ProductCode, External_key__c, ExternalIdColumn) SELECT Name, ProductCode, External_key__c, ExternalIdColumn FROM Product2#TEMP" requireInput="false">
  </UPSERTProduct2>
</Items>
 
 
この設定により、Salesforce コネクタに連携されたデータはProduct2 タグの一時テーブル書込みにマッピングされ、最後にUPSERTProduct2 タグで一時テーブルをソースにUpsert が実行されます。
 
同期SOAP API を使ったバッチでのUpsert の場合、デフォルトでは200 件ごとのバッチでUpsert されます。
 
Bulk API でのバッチUpsert
 
データ量が数万件を超えるような規模の場合、SOAP API ではなく、Bulk API の活用が不可欠かと思います。同期SOAP API ではなく、非同期のBulk API で実行したい場合、Salesforce コネクタの「高度な設定 - Use Bulk API」を「True」として構成してください。
 
 
非同期Bulk API を使ったバッチでのUpsert の場合、デフォルトでは10000 件ごとのバッチに分割されます。
 
 
 

おわりに

 

初期データの登録や既存システムからのマスタ連携などでは、Salesforce へ数万件を超えるようなレコードの登録・更新を行いたいケースも多々あると思います。
 
変換や加工を伴わない単純な登録であれば、Salesforce のデータインポートウィザードやDataLoader の利用が選択肢に挙がることが多いかとも思いますが、連携したいデータが既存システムなど何か他のデータソース由来の場合、多くのケースで変換や加工などの前処理が欠かせません。連携元からのデータ取得・変換や加工などの前処理・Salesforce へのバッチ登録、一連の流れを自動化したいという際には、CData Arc をぜひ利用してみてください。
 
CData Arc はシンプルで拡張性の高いコアフレームワークに、豊富なMFT・EDI・エンタープライズコネクタを備えたパワフルな製品です。CData Drivers との組み合わせで250を超えるアプリケーションへの連携を実現できます。必要な連携を低価格からはじめられる事も大きな特長です。
 
皆さんのつなぎたいシナリオでぜひ CData Arc を試してみてください。

 

製品を試していただく中で何かご不明な点があれば、テクニカルサポートへお気軽にお問い合わせください。
 

この記事では CData Arc™ 2022 - 22.0.8285.0 を利用しています。

関連コンテンツ

トライアル・お問い合わせ

30日間無償トライアルで、CData のリアルタイムデータ連携をフルにお試しいただけます。記事や製品についてのご質問があればお気軽にお問い合わせください。