CData Software Blog

クラウド連携のCData Software の技術ブログです。

JRuby を使って Salesforce のデータを操作する:CData JDBC Driver

こんにちは。CData Software Japan リードエンジニアの杉本です。

最近 JRuby というJVM上で動かすことができる RubyインタプリタJava実装を知りました。

https://www.jruby.org/

以下のWikiでも書かれている通り、JRubyJavaプラットフォームのクラスを参照して、利用することが可能になっています。面白いですね。

ja.wikipedia.org

include Java

frame = javax.swing.JFrame.new()
frame.getContentPane().add(javax.swing.JLabel.new('Hello, World!'))
frame.setDefaultCloseOperation(javax.swing.JFrame::EXIT_ON_CLOSE)
frame.pack()
frame.set_visible(true)

そこで今回はJRuby から CData JDBC Driver を使って、Salesforceに接続するというのをやってみました。

手順

必要なもの

今回は予めJDKがインストールしてあるWindowsマシンで試しています。

jRuby本体の入手

以下からJRuby本体を入手して、任意のフォルダに展開しました。

https://www.jruby.org/download

f:id:sugimomoto:20200703155114p:plain

環境変数でPathを通して実行できる状態にしておきます。

> jruby -version
> jruby 9.1.17.0 (2.3.3) 2018-04-20 d8b1ff9 OpenJDK 64-Bit Server VM 11.0.1+13 on 11.0.1+13 +jit ```

Salesforce JDBC Driver のインストール

続いて、CData Salesforce JDBC Driver をインストールします。トライアルは以下のURLから入手できます。

https://www.cdata.com/jp/drivers/salesforce/jdbc/

f:id:sugimomoto:20200116122206p:plain

ダウンロード後、exeファイルを実行し、セットアップを進めます。

f:id:sugimomoto:20200116122213p:plain

インストール完了後「C:\Program Files\CData\CData JDBC Driver for Salesforce 2019J\lib」にDriver本体であるjarファイルが生成されます。

f:id:sugimomoto:20200703155121p:plain

JRuby で CData JDBC Driver へアクセスする

まずシンプルなプログラムでアクセスしてみたいと思います。JRubyJavaのクラスやメソッドをそのまま呼び出せるので、CData JDBC Driverのヘルプに書かれているコードを参考に実装することができます。

http://cdn.cdata.com/help/RFE/jp/jdbc/pg_JDBCqueries.htm

単純にAccount一覧を取得するプログラムを書いてみました。

gist.github.com

実行すると、以下のようにJDBC経由でデータを取得できました。

>jruby -S Sample.rb

0012x000009VGSvAAO GenePoint CDataUpdate
0012x000009VGStAAO United Oil & Gas, UK
0012x000009VGSuAAO United Oil & Gas, Singapore
0012x000009VGSlAAO Edge Communications
0012x000009VGSmAAO Burlington Textiles Corp of America
0012x000009VGSnAAO Pyramid Construction Inc.
0012x000009VGSoAAO Dickenson plc
0012x000009VGSpAAO Grand Hotels & Resorts Ltd
0012x000009VGSrAAO Express Logistics and Transport
0012x000009VGSsAAO University of Arizona
0012x000009VGSqAAO United Oil & Gas Corp.
0012x000009VGSwAAO sForce

システムテーブル参照・プリペアドステートメント・INSERT・UPDATE

JDBC Driverは各種テーブルやカラム情報を取得するためのシステムテーブルや、プリペアドステートメント・INSERT・UPDATEもサポートしています。

ざっといろんな機能を試したソースコードが以下の通りになります。

基本的にはJDBC実行の文法さえおさえておけば、Javaと同様のアプローチで実行できます。

gist.github.com

以下のような結果を得ることができました。問題なくJavaからの実行と同等の機能が得られています。

> jruby -S SampleCodeForSalesforce.rb

-----------Table List-----------
CatalogName     SchemaName      TableName       TableType       Description
CData   Salesforce      AcceptedEventRelation   TABLE
CData   Salesforce      Account TABLE
CData   Salesforce      AccountCleanInfo        TABLE
CData   Salesforce      AccountContactRole      TABLE
CData   Salesforce      AccountFeed     TABLE
CData   Salesforce      AccountHistory  TABLE
CData   Salesforce      AccountPartner  TABLE
CData   Salesforce      AccountShare    TABLE
CData   Salesforce      ActionLinkGroupTemplate TABLE
CData   Salesforce      ActionLinkTemplate      TABLE

-----------Table Column List-----------
CatalogName     SchemaName      TableName       ColumnName      DataType
CData   Salesforce      Account Id      12
CData   Salesforce      Account IsDeleted       16
CData   Salesforce      Account MasterRecordId  12
CData   Salesforce      Account Name    12
CData   Salesforce      Account Type    12
CData   Salesforce      Account ParentId        12
CData   Salesforce      Account BillingStreet   12
CData   Salesforce      Account BillingCity     12
CData   Salesforce      Account BillingState    12
CData   Salesforce      Account BillingPostalCode       12

-----------SELECT Records-----------
Id      Name    AccountNumber
0012x000009VGSvAAO      GenePoint CDataUpdate   CC978213
0012x000009VGStAAO      United Oil & Gas, UK    CD355119-A
0012x000009VGSuAAO      United Oil & Gas, Singapore     CD355120-B
0012x000009VGSlAAO      Edge Communications     CD451796
0012x000009VGSmAAO      Burlington Textiles Corp of America     CD656092
0012x000009VGSnAAO      Pyramid Construction Inc.       CC213425
0012x000009VGSoAAO      Dickenson plc   CC634267
0012x000009VGSpAAO      Update  CD439877
0012x000009VGSrAAO      Express Logistics and Transport CC947211
0012x000009VGSsAAO      University of Arizona   CD736025

-----------INSERT Record -----------
affect_count : 1
Id      Name    AccountNumber
0012x000008uVjSAAU      Hello
0012x000009VGSvAAO      GenePoint CDataUpdate   CC978213
0012x000009VGStAAO      United Oil & Gas, UK    CD355119-A
0012x000009VGSuAAO      United Oil & Gas, Singapore     CD355120-B
0012x000009VGSlAAO      Edge Communications     CD451796
0012x000009VGSmAAO      Burlington Textiles Corp of America     CD656092
0012x000009VGSnAAO      Pyramid Construction Inc.       CC213425
0012x000009VGSoAAO      Dickenson plc   CC634267
0012x000009VGSpAAO      Update  CD439877
0012x000009VGSrAAO      Express Logistics and Transport CC947211

-----------SELECT Records by PreparedStatement -----------
Id      Name    AccountNumber
0012x000009VGSpAAO      Hello  CD439877

-----------UPDATE Record -----------
affect_count : 1
Id      Name    AccountNumber
0012x000009VGSpAAO      Update  CD439877

おわりに

JRuby面白いですね。

CData では Salesforce 以外にも数多くの JDBC Driver を提供しています。

kintone や Sansan といった日本のクラウドサービスや JIRA、Gmail などKBやナレッジが非定形で蓄積されているようなデータソースにも対応しているので、エンタープライズ検索のデータとして活用できるのではないかなと思います。

https://www.cdata.com/jp/jdbc/

f:id:sugimomoto:20200116122333p:plain

すべて30日間のトライアルがあるので、是非一度試してみてください。