Blogical

AWS/Salesforceを中心に様々な情報を配信していきます(/・ω・)/

Pythonを使用したデータベースとSalesforceの連携方法(3) - Pythonを用いたOracle DatabaseとSalesforceの連携

おはようございます。ロジカル・アーツ株式会社のSE 輪島 幸治です。

Pythonを使用してデータベースとSalesforceを連携するSalesforceインテグレーションの記事を執筆させて頂きます。 目標としては、Pythonプログラムにて、Oracle DatabaseにSQLを実行して取得した結果を加工して、 SalesforceAPI連携できれば、目標達成としています。

ブログの記事構成は3部構成となっており、(1)Oracle Databaseインストール方法及びGUI環境構築、 (2)Pythonライブラリインストール・データ取得・インポート、 (3)Pythonを用いたOracle DatabaseとSalesforceの連携という3つの記事構成になっています。

このブログ記事の範囲は、(3)Pythonを用いたOracle DatabaseとSalesforceの連携です。 Pythonでプログラミングされる方などは、Salesforceを使用している方は少ないと思いますので、 Salesforceのカスタムオブジェクトの作成方法から載せさせて頂いております。 Salesforceのカスタムオブジェクトはデータベースのテーブルのようなものです。

ブログ記事では、初心者向けに、Salesforceのカスタムオブジェクトの作成方法と Pythonスクリプトの作成と実行を行い、Salesforce上の設定を行い、 実際にSalesforceと連携を行うところまでをご紹介させて頂きます。

Pythonプログラムで、Oracle DatabaseにSQLを実行して取得した結果を、 SalesforceAPI連携できれば、目標達成としています。

はじめに

この記事の目的

この記事では、初心者向けにSalesforceの設定を行い、Pythonプログラムを実行して、 Oracle DatabaseからSalesforceにデータ連携を行うインテグレーションについて執筆させて頂きます。

この記事は、3部構成の3本目のブログ記事です。 データベースやPython環境、Pythonライブラリがインストールされている環境での実行を想定しています。

実行環境の構築方法については、過去記事の(1)Oracle Databaseインストール方法及びGUI環境構築および (2)Python環境構築・ライブラリインストール・データ取得・インポートをご確認下さい。

blog.logical.co.jp

blog.logical.co.jp

対象者

この記事では、一般的なデータベースを使用しているユーザが、 Webのフロントシステムとの連携を検討した際に、Salesforceを使用したインテグレーションを検討する方向け。 あるいはSalesforceしかエンタープライズアプリケーションを使用したことがない方。 データベースを使用しているユーザが、Salesforceのシステムインテグレーションを検討することを想定しています。 初心者向けの記事で、Oracle DatabaseやCSVファイルからPythonプログラムを介して、Salesforceにレコード作成できれば良いという方を対象としています。

目標

Pythonプログラムにて、データベースからSalesforce連携を行う場合に、設定理解を目標とした記事です。 データベースやSalesforceの設定をする時間がないので、 画像だけで設定概要を知りたいという方が設定方法の流れを知って頂くことも目標としています。 Oracle Databaseのインストール・設定、Pythonアプリケーションのライブラリインストール、 プログラムを使用したSalesforce連携手順を画像付きでご紹介させて頂きます。

Salesforceの研究情報について

さて、この記事でご紹介させて頂くSalesforceのインテグレーション方法ですが、 2020年度に情報通信研究機構の研究員として、情報処理学会の研究会にて提案させて頂いたインテグレーション方法です。

www.ipsj.or.jp

研究会でのSalesforceを使用した発表に興味を持たれた方向けに簡単に発表のご説明させて頂きますと、 研究提案では、アラートが格納されたOracle Databaseから、Pythonでデータ連携を行いSalesforceに連携して、 Salesforce Einstein Analytics(現在のTableau CRM)を使用してアラートの時系列分析を行っています。

第13回 インターネットと運用技術シンポジウム(IOTS 2020)

Permalink : http://id.nii.ac.jp/1001/00208118/

輪島 幸治,セキュリティベースのデータ変換プロセスに基づくSalesforce Einstein Analyticsを用いたデータ解析,インターネットと運用技術シンポジウム論文集,2020,95-96,2020-11-26

2020年度第4回(IOT通算第52回)研究会プログラム

Permalink : http://id.nii.ac.jp/1001/00209394/

輪島 幸治,高橋 健志,井上 大介,Salesforce Einstein Analyticsを用いたIDSデータからの脅威アラートスクリーニングの試み,研究報告インターネットと運用技術(IOT),2021-IOT-52 ,1,1-8,2021-02-22

以上、ご参考まで。

Salesforceにおけるカスタムオブジェクトの作成について

PythonライブラリでSalesforceにレコード連携を行う場合は、連携するレコードを格納するカスタムオブジェクトの作成が必要です。

Salesforceの設定についてご説明させて頂きます。 PythonユーザでSalesforceを使用している方は少ないかもしれませんので、カスタムオブジェクトの作成手順から紹介させて頂きます。

データベース初心者にSalesforceの仕組みを理解頂くためには、従来のSalesforce Classicのデザインの方が分かり易いので、 この記事では、Salesforce Classicを用いて説明をさせて頂きます。*1

trailhead.salesforce.com

慣れると非常に簡単にエンタープライズソフトウェアでのインテグレーションや開発が行えます。*2

Trailheadなどに記載がありますが、Salesforce は「Amazon で本を買うように、エンタープライズソフトウェアを簡単に使用できるようにする」というアイデアから生まれた会社です。*3*4

レコード連携を行うSalesforceユーザは、プロファイル権限のAPI の有効化という権限を持っている必要があります。 商用環境ではなく、Developer Editionを使用されている方は、システム管理者プロファイルのユーザにて連携検証して下さい。

SalesforceAPI連携専用ユーザを作成したい方は、ナレッジがありますので、こちらを参考にしてみて下さい。

新規カスタムオブジェクトの作成

Salesforceでの新規カスタムオブジェクトの作成です。まず、Salesforceにログインします。

f:id:logicalarts:20210523193130p:plain
(00)

カスタムオブジェクトのメニューから、[新規カスタムオブジェクト]を押下します。

[Setup] > [作成] > [オブジェクト]

f:id:logicalarts:20210523193148p:plain
(01)

連携用のカスタムオブジェクトを作成します。 項目値は、下記の通りです。

項目名 項目値
表示ラベル sklearn_california_housing
オブジェクト名 sklearn_california_housing
レコード名 sklearn_california_housing
データ型 自動採番
表示形式 house-{0000}
開始番号 0
レポートを許可 チェック
活動を許可 チェック
項目履歴管理 チェック
Chatter グループ内で許可 チェック
共有を許可 チェック
Bulk API アクセスを許可 チェック
ストリーミング API アクセスを許可 チェック
リリース状況 リリース済み
検索を許可 チェック
デフォルトのページレイアウトに、メモと添付ファイルを追加する チェック
カスタムオブジェクトの保存後、新規カスタムタブウィザードを起動する チェック

f:id:logicalarts:20210523193201p:plain
(02)

作成したカスタムオブジェクトのタブを作成します。

項目名 項目値
オブジェクト sklearn_california_housing
タブスタイル CD/DVD

f:id:logicalarts:20210523193221p:plain
(03)

新規カスタムタブの作成

カスタムタブのプロファイル設定を行い、[次へ]を押下します。

項目名 項目値
プロファイルに追加 1つのタブ表示をすべてのプロファイルに適用する[デフォルト]

f:id:logicalarts:20210523193235p:plain
(04)

カスタムアプリケーションに追加します。

項目名 項目値
カスタムアプリケーション タブを含める

f:id:logicalarts:20210523193252p:plain
(05)

新規カスタム項目の作成

連携するデータベース項目と同じカスタム項目を作成します。 カスタム項目の作成方法については割愛させて頂きます。

f:id:logicalarts:20210523193307p:plain
(06)

Salesforce 連携 Pythonスクリプトの作成と実行

Salesforceにてカスタムオブジェクトの設定が完了致しましたら、Jupyter NotebookでPythonスクリプトを作成して、Oracle Databaseからデータの連携を行います。

今回は、サンプル用のソースコードを用意しておきましたので、 "Salesforce連携用データベース構築(1) - Oracle Databaseインストール方法及びGUI環境構築まで"と "Salesforce連携用データベース構築(2) - ライブラリインストール・データ取得・インポート"を 読んでオンプレミス側のOracle DatabaseやPythonライブラリの設定が完了していれば、Jupyter Notebookにて実行するのみです。

注意したいポイントとしては、Salesforce側にはガバナ制限が設定されています。 短時間当たりのレコードの上限数が設定されています。 このため、Oracle Database側にはレコードの上限が設定されていなくても、Salesforce側で処理できない場合があります。Salesforceとの大量データ連携の場合は、単位時間あたりのレコード数の上限値にご注意下さい。

Python データ連携 - ソースコード

Oracle Databaseと連携を行うPythonのプログラムです。 Pythonのプログラムは、Jupyter Notebookにて実行するのみですが、 TARGET_HOSTやPORTの箇所などは、適宜変更下さい。

ソースコードについては、一部変数名の修正をさせて頂いており、画像と異なる箇所がございます。ご了承下さい。

#import
import cx_Oracle
import pandas as pd

#Database User Info
TARGET_HOST = '10.0.2.15'
PORT = '1521'
SERVICE_NAME = 'orcl.0.2.15'
USERID = 'SYS'
PASSWORD = '**パスワード**'

#Connection Info
cx_connection = cx_Oracle.connect(USERID,PORT,
                                  TARGET_HOST + '/' + SERVICE_NAME,cx_Oracle.SYSDBA)
cx_connection

#SQL(Oracle)
OracleSQL_Dataframe=pd.read_sql_query("Select * From SKLEARN_CALIFORNIA_HOUSING",
                                      cx_connection)
OracleSQL_Dataframe

#index rename
OracleSQL_Dataframe.columns = [
    'MEDINC__c','HOUSEAGE__c',
    'AVEROOMS__c','AVEBEDRMS__c',
    'POPULATION__c','AVEOCCUP__c',
    'LATITUDE__c','LONGITUDE__c'
]

from salesforce_bulk import SalesforceBulk

#Salesforce Login Info
bulk = SalesforceBulk(username='logical2021webapp@gmail.com.salesforcebulk01.oracle',
                      password='************',
                      security_token='pQCuqczb6TERnb4nbyo17xe7')

from salesforce_bulk import CsvDictsAdapter

#Bulk Job Info
job = bulk.create_insert_job("sklearn_california_housing__c",contentType='CSV')

#Salesforce API Limits
api_limits_data = OracleSQL_Dataframe.iloc[0:10000]
api_limits_data

#Data list
insertdata = []

#Convert Dictionary Data
for row in range(len(api_limits_data)):
    insertdata.append(api_limits_data.iloc[row].to_dict())

#Convert Row data(Sample)
insertdata[0]

#Convert Data
csv_iter = CsvDictsAdapter(iter(insertdata))

#Bulk API Job 
batch = bulk.post_batch(job, csv_iter)
bulk.wait_for_batch(job, batch)

#Close Job
bulk.close_job(job)
print("Done. Records uploaded.")

Jupyter notebookのスクリプト(ipynb)の作成

Salesforce連携用のPythonプログラムで、Jupyter notebookのスクリプト(ipynb)を作成します。 Jupyter notebookにそのままコピーすれば良いのですが、この記事では、分割して説明させて頂きます。

f:id:logicalarts:20210523193425p:plain
(07)

まず、ソースコードの下記のコードで、Oracle Databaseの接続設定を行います。

f:id:logicalarts:20210523193448p:plain
(08)

TARGET_HOSTやPORTの箇所などは、適宜変更下さい。

#import
import cx_Oracle
import pandas as pd

#Database User Info
TARGET_HOST = '10.0.2.15'
PORT = '1521'
SERVICE_NAME = 'orcl.0.2.15'
USERID = 'SYS'
PASSWORD = '**パスワード**'

接続設定が行えましたら、下記のコードで、Oracle Databaseに接続します。

#Connection Info
cx_connection = cx_Oracle.connect(USERID,PORT,
                                  TARGET_HOST + '/' + SERVICE_NAME,cx_Oracle.SYSDBA)
cx_connection

Oracle Databaseに対する接続状況が問題なければ、 SQLを実行してOracle Databaseからレコードを取得します。

#SQL(Oracle)
OracleSQL_Dataframe=pd.read_sql_query("Select * From SKLEARN_CALIFORNIA_HOUSING",
                                      cx_connection)
OracleSQL_Dataframe

接続に成功して、Databaseのレコードがpandasオブジェクトに変換されていることを確認します。

f:id:logicalarts:20210523193500p:plain
(09)

pandasのDataFrameオブジェクトに変換したデータをインポートするためには、いくつかPythonで加工と設定が必要です。 Salesforce連携するためには、データベースの項目名を連携前にプログラムで加工する必要があります。 データベースの項目名をカスタムオブジェクトのAPI参照名に変更することで連携を行うことができます。

また、Salesforceへのログイン情報を指定して、ジョブを作成する必要があります。そして、インポート先のカスタムオブジェクトの指定する必要もあります。

f:id:logicalarts:20210527092446p:plain
(10)

pandasのDataFrameの項目名をSalesforceのインポート先のカスタムオブジェクトのAPI参照名に変更します。

#index rename
OracleSQL_Dataframe.columns = [
    'MEDINC__c','HOUSEAGE__c',
    'AVEROOMS__c','AVEBEDRMS__c',
    'POPULATION__c','AVEOCCUP__c',
    'LATITUDE__c','LONGITUDE__c'
]

そして、Salesforceにログインします。ログインの際には、プロファイルのIPアドレス制限でIPアドレスの指定をしていない場合は、セキュリティトークンが必要となります。

#Salesforce Login Info
bulk = SalesforceBulk(username='logical2021webapp@gmail.com.salesforcebulk01.oracle',
                      password='************',
                      security_token='pQCuqczb6TERnb4nbyo17xe7')

インポート先のカスタムオブジェクトを指定して、ジョブを作成します。

from salesforce_bulk import CsvDictsAdapter

#Bulk Job Info
job = bulk.create_insert_job("sklearn_california_housing__c",contentType='CSV')

f:id:logicalarts:20210523193513p:plain
(11)

ガバナ制限に対応するために、1ジョブあたりのレコード数を制限します。 この記事では、API制限のレコード数に対応するために10,000レコードのみをインポートしていますが、適宜、繰り返しの処理などを作成して下さい。

Salesforce Developer の制限および割り当てクイックリファレンス - Bulk API および Bulk API 2.0 の制限および割り当て

#Salesforce api Limits
api_limits_data = OracleSQL_Dataframe.iloc[0:10000]
api_limits_data

pandasのDataframeをSalesforceBulkのCsvDictsAdapterを使用して、 インポート可能な形式に変換します。

f:id:logicalarts:20210523193616p:plain
(12)

f:id:logicalarts:20210523193632p:plain
(13)

pandasのDataframeをSalesforceBulkのCsvDictsAdapterを使用して、 インポート可能な形式に変換します。

#Convert Row data(Sample)
insertdata[0]

#Convert Data
csv_iter = CsvDictsAdapter(iter(insertdata))

f:id:logicalarts:20210523193645p:plain
(14)

bulk.post_batchを使用して、バッチに変換後、bulk.wait_for_batchを使用して、Salesforce連携を行い、レコードをSalesforceにアップロードすると、Salesforceに対してレコード連携することができます。

#Bulk API Job 
batch = bulk.post_batch(job, csv_iter)
bulk.wait_for_batch(job, batch)
#Close Job
bulk.close_job(job)
print("Done. Records uploaded.")

f:id:logicalarts:20210523193700p:plain
(15)

連携結果の確認方法

Salesforceにログインします。

f:id:logicalarts:20210523193713p:plain
(16)

設定メニューから、[一括データ読み込みジョブ]を開きます。

[Setup] > [ジョブ] > [一括データ読み込みジョブ]

f:id:logicalarts:20210523193725p:plain
(17)

一括データ読み込みジョブから、ジョブの実行が成功されていることを確認します。

[Setup] > [ジョブ] > [一括データ読み込みジョブ]

f:id:logicalarts:20210523193737p:plain
(18)

インポート先のカスタムオブジェクトsklearn_california_housingのタブを開き、ビューを表示します。するとインポートを行ったレコード一覧が確認できます。

f:id:logicalarts:20210523193749p:plain
(19)

レコードを1件開き、レコードの項目値を確認します。 レコードを確認するとOracle DatabaseからPythonを介して、レコードの項目値にデータ連携が行われ、Salesforce上に格納されていることが確認できます。

f:id:logicalarts:20210523193801p:plain
(20)

まとめ

以上が、PythonプログラムでOracle Databaseから Salesforceにデータを連携させるPythonプログラムの概要とその実行手順です。

この記事の範囲であるSalesforceのカスタムオブジェクトを作成して、Pythonプログラムを使用して、 Oracle DatabaseからSalesforceにデータを連携するところまではできたと言えます。

ブログ記事で紹介させて頂いたプログラムを使用するを行うことで、 Pythonプログラムを介して、Oracle DatabaseからSalesforceにデータを連携することができます。

Pythonプログラムと連携できると多くのインテグレーションパターンを検討することができます。

データベースからSalesforceに連携するプロジェクトや研究会プロジェクトなどで、 紹介させて頂いたライブラリの使用を検討してみて下さい。

よろしくお願いいたします。

備考

この記事は、著者が独自に調査した結果を、ロジカル・アーツ株式会社のブログにて記事化したものです。記載されている手順やアドレスなどは、予告なく変更される場合もあります。 この記事に記載されている会社名、商品名などは一般に各社の商標または登録商標です。なお、本文中には、™、®を明記しておりません。 クラウドアプリケーションは、成長が著しいため、機能更新も早いです。至らない箇所もあると思いますが、お気付きの点がありましたらお問い合わせ下さい。

クラウドアプリケーショントレンド(参考)

Stack Overflow Insights - Stack Overflow Trends

f:id:logicalarts:20210806115652p:plain
Stack Overflow Trends(2009-2021)

www.google.com

f:id:logicalarts:20210806115708p:plain
[Google Finance - CRMNYSE - セールスフォース・ドットコム]

よろしくお願いいたします。

*1:Salesforceユーザーインターフェースのデザインは、Lightning Experienceが主流になってきています。Lightning Experienceは自動化機能やカスタマーサイトの構築の平易さなどで優れています。

*2:ナレッジとチャットを含む Experience Cloud サイトの作成:https://trailhead.salesforce.com/ja/content/learn/projects/build-a-community-with-knowledge-and-chat

*3:中小企業向け CRM の利点の探索 : https://trailhead.salesforce.com/ja/content/learn/modules/salesforce-essentials-small-business/benefits-crm-small-business

*4:How Salesforce's Marc Benioff Revolutionized The Software Industry : https://www.investors.com/news/management/leaders-and-success/how-salesforces-marc-benioff-revolutionized-the-software-industry/