こんにちは。CData Software Japan リードエンジニアの杉本です。
今回はCData Python Connector の基本的な使い方、JupyterLabを使ってデータを取得したり、更新したりする方法を解説します。
CData Python Connector とは?
CData Python Connector はSalesforceやKintoneといった SaaS、NoSQL、ビッグデータ連携用のDB-API モジュールです。
pandas、SQLAlchemy、Dash、petl など多様なツールから利用可能となっており、各Web APIの仕様の違いを意識することなく、 シンプルなコマンドラインベースのデータ操作を可能にします。
https://www.cdata.com/jp/python/
CData Python Connecter は Python DB API をベースに開発されています。
https://peps.python.org/pep-0249/
本記事ではCData Python Connector for Salesforce を例として、Pythonからの利用方法、機能について解説します。
事前準備
・Python のインストール
・PIP のインストール
・JupyterLabのインストール
今回はWindows環境で利用するので、以下のリンクからPython 3.9.13のWindows Installerを入手してセットアップしました。
https://www.python.org/downloads/release/python-3913/
公式PythonにはPIPもデフォルトで含まれていますので、そのままそれを利用します。
また、合わせて「pip install jupyterlab」でJupyter Labをインストールしています。
https://jupyter.org/install
CData Python Connector のインストール・アクティベーション方法
最初にCData Python Connector を対象のマシンにインストールします。以下のリンクから評価版をダウンロードします。
https://www.cdata.com/jp/drivers/salesforce/download/python/
今回はWindows版を利用しますが、Unix/LinuxまたMac版も提供しています。
Windows版はダウンロード後、ZIPファイルを回答します。Pythonのバージョンごとにフォルダが分かれているので、任意のフォルダおよびOSのBit数のフォルダに移動してPIPコマンドでWhlファイルを使いインストールします。
https://cdn.cdata.com/help/RFG/jp/py/pg_pyinstallation.htm
cd C:\Work\SalesforcePythonConnector\CData.Python.Salesforce\win\Python39\64
pip install cdata_salesforce_connector-21.0.8137-cp39-cp39-win_amd64.whl
インストール後、ライセンスのアクティベーションを行ってください。
例えば今回はAdministratorユーザーでインストールを行ったので、以下のフォルダパスにアクセスします。
C:\Users\Administrator\AppData\Local\Programs\Python\Python39\Lib\site-packages\cdata\installlic_salesforce
「install-license.exe」をダブルクリックします。
名前とメールアドレスの入力を行い、アクティベーションを完了させます。これでトライアルのインストールが完了します。
JupyterLabの立ち上げ
今回の記事ではPythonの実行にJupyterLabを利用するのでコマンドプロンプトを立ち上げて「jupyter-lab」を入力し、起動します。
「Python3」のNotebookを立ち上げます。
コネクション構成
それでは実際にCData Python Connector を使っていきましょう。
CData Python Connector はどのデータソースでも接続文字列という方式でAPIへの接続・認証(OAuthの場合は認証・認可のプロセス含め)を行います。
Salesforceでは以下のようにUser・Password・SecurityTokenの3種類のプロパティを接続文字列として設定します。
https://cdn.cdata.com/help/RFG/jp/py/pg_usagescriptconnectpy.htm
import cdata.salesforce as mod
conn = mod.connect("user=XXXXX@XXXX;Password=XXXX;SecurityToken=XXXXX;")
なお、各コネクターでは複数の認証方法をサポートしているものもあります。例えば、Salesforceの場合はOAuthやOAuthJWTによる接続もサポートしています。
https://cdn.cdata.com/help/RFG/jp/py/pg_connectionpy.htm
import cdata.salesforce as mod
conn = mod.connect("InitiateOAuth=GETANDREFRESH;")
これを設定して、実行すると以下のようにブラウザが立ち上がり、OAuthの認証・認可プロセスが実施されます。
ログイン後、以下のように成功画面が表示されれば接続完了です。
取得したAccess TokenはOAuthSettingsLocationプロパティで指定されたフォルダに暗号化されて配置されます。
https://cdn.cdata.com/help/RFG/jp/py/RSBSalesforce_p_OAuthSettingsLocation.htm
テーブル一覧の取得
それでは実際にSalesforceへのクエリを試していきましょう。
CData Python Connector ではすべてのAPIのデータに対してSQLでアクセスできるようになっています。また、併せて各APIを独自にデータモデル化し、テーブル・ビュー・ストアドプロシージャの形式で利用できるようにしています。
クエリは「conn.execute("SQL文").fetchall()」で行うことができます。
とはいえ、まずそれぞれのAPIで利用できるテーブルやカラムを特定しなければいけません。通常のWeb APIであれば、そのAPIの仕様書をドキュメントやSwagger・OpenAPIといった外部仕様で確認しなければいけませんが、CData Python Connector では Metadata を検出する機能がサポートされています。
例えば、テーブル・ビューの一覧であれば、以下のように「sys_tables」というテーブルをクエリするだけで取得することができます。
https://cdn.cdata.com/help/RFG/jp/py/pg_table-systables.htm
conn.execute("SELECT TableName,TableType FROM sys_tables LIMIT 10").fetchall()
テーブルのカラム一覧の取得
テーブルを取得したらそのテーブルに関連するカラムも取得してみましょう。カラムの取得には「sys_tablecolumns」テーブルを利用できます。
https://cdn.cdata.com/help/RFG/jp/py/pg_table-systablecolumns.htm
conn.execute("SELECT ColumnName, DataTypeName FROM sys_tablecolumns WHERE TableName='Account' LIMIT 10").fetchall()
各APIではオブジェクトの型などが厳密に定義されていない場合が多いですが、CDataではそれらも事前に定義し、ユーザーが集計処理や日付のフィルターなどが扱いやすいように提供することも大きな特徴となっています。
データのクエリ
テーブル名とカラム名の特定ができたら、実際にデータを取得してみましょう。今回はSQLを手打ちで組み立てますが、事前にテーブル名とカラム名を特定できれいれば、動的にクエリを組み立てるようなUIを構成することも可能でしょう。
今回は取引先(Account)テーブルからデータを取得してみます。
https://cdn.cdata.com/help/RFG/jp/py/pg_usagescriptquerypy.htm
conn.execute("SELECT Name, AccountNumber FROM Account LIMIT 10").fetchall()
ちなみに、CData Python Connector はフィルター条件や集計クエリなども柔軟に実施することが可能です。例えば従業員数1000名以上のデータを取得したい場合、以下のようにクエリすることが可能です。
https://cdn.cdata.com/help/RFG/jp/py/pg_select.htm
conn.execute("SELECT Id, Name, NumberOfEmployees FROM Account WHERE NumberOfEmployees > 1000").fetchall()
GROUP BYやSUMを用いた集計クエリも可能です。
conn.execute("SELECT Type, SUM(NumberOfEmployees) NumberOfEmployees FROM Account GROUP BY Type").fetchall()
なお、CData Python Connector はSQLをAPIのリクエストに変換してデータを取得、結果を表形式で返します。もしAPIのサポートを超える範囲のSQLが実行された場合は、一度APIから全データを取得し、インメモリによるクライアントサイド側で処理するようになっています。
https://cdn.cdata.com/help/RFG/jp/py/RSBSalesforce_p_SupportEnhancedSQL.htm
データの作成・更新・削除
続いてデータの作成・更新・削除を行ってみましょう。CData Python Connector では通常のRDBと同じようにINSERT・UPDATE・DELETE文を用いてそれぞれのデータの処理を行うことができます。
https://cdn.cdata.com/help/RFG/jp/py/pg_usagescriptupdatepy.htm
例えば、データの作成処理は以下のようになります。
conn.execute("INSERT INTO Account(Name,NumberOfEmployees)VALUES('Python Sample',1000)").rowcount
conn.execute("SELECT Id, Name, NumberOfEmployees FROM Account WHERE Name = 'Python Sample'").fetchall()
UPDATEも同様です。登録したデータの従業員数を変更してみましょう。
conn.execute("UPDATE Account SET NumberOfEmployees = 3000 WHERE Name = 'Python Sample'").rowcount
conn.execute("SELECT Id, Name, NumberOfEmployees FROM Account WHERE Name = 'Python Sample'").fetchall()
最後に削除です。
conn.execute("DELETE FROM Account WHERE Name = 'Python Sample'").rowcount
conn.execute("SELECT Id, Name, NumberOfEmployees FROM Account WHERE Name = 'Python Sample'").fetchall()
APIによっては、削除するために特定のIDを指定する必要もあります。詳しい操作方法はデータソース・テーブル毎の各ドキュメントを参照ください。
https://cdn.cdata.com/help/UXG/jp/odbc/pg_table-customers.htm
ストアドプロシージャの実行
最後にストアドプロシージャの実行方法について解説します。
CData Python Connector ではテーブル・ビューのデザインにフィットしない、例えばバージョン情報の取得や添付ファイルのアップロード・ダウンロードといった特殊なAPIロジックをストアドプロシージャとして提供しています。
https://cdn.cdata.com/help/RFG/jp/py/pg_usagescriptprocpy.htm
例えばSalesforceにファイルをアップロードしたい場合は、以下のようにストアドプロシージャを実行します。
https://cdn.cdata.com/help/RFG/jp/py/pg_sp-uploadattachment.htm
conn.execute("EXECUTE UploadAttachment ObjectId = '0017F000043zARYQA2', FullPath = 'C://Work//i_connect.png', LightningMode = true").rowcount
これでSalesforceの画面を以下のようにファイルがアップロードされていることがわかります。
他のデータソースについて
ここまでSalesforce をベースに紹介してきましたが、このアプローチで他のクラウドサービス、例えばKintoneやSmaregiなどがすべて同じようにSQLでクエリ、データの更新などが可能です。
【スマレジのクエリ例】
import cdata.smaregi as mod
conn = mod.connect("ContractId=mycontractid;AccessToken=myaccesstoken;")
conn.execute("SELECT CustomerId, FirstName, LastName FROM Customers LIMIT 10").fetchall()
【kintoneのクエリ例】
import cdata.kintone as mod
conn = mod.connect("User=XXXXX;Password=XXXXX;URL=https://XXXXXX.cybozu.com/;")
conn.execute("SELECT [顧客名],[メールアドレス] FROM [顧客管理(営業支援パック)] LIMIT 10;").fetchall()
おわりに
このようにCData Python Connector を利用することで、各種クラウドサービスのデータを手軽に取得して、Python で処理することが可能になります。
実際に触っていて、わからない部分、気になる部分があれば、お気軽にテクニカルサポートまでお問い合わせください。
https://www.cdata.com/jp/support/submit.aspx
関連コンテンツ