各製品の資料を入手。
詳細はこちら →Go-MySQL-Driver を使って Salesforce のデータをCData Connect 経由で取得してみる:CData Connect MySQL Wire protocol
こんにちは。CData Software Japanリードエンジニアの杉本です。
このBlogでもちょくちょく紹介しているCData Connect はSalesforce や KintoneなどのクラウドサービスAPIに接続するためのプロトコルとしてTDS(SQL Server)・MySQL(MySQL Wire protocol)・ODataの3種類をサポートしています。
通常であれば、以下のBlogのようにBIツールやローコードサービスが持つMySQLインターフェースを通じて活用するのが主な利用シナリオですが、各種プログラミング言語から直接それぞれのインターフェースを使うことももちろん可能です。
というわけで今回はプリミティブな使い方として、Go言語からMySQL Wire protocolを通じて、Salesforce のデータにアクセスする方法を紹介したいと思います。
なお、MySQL Workbenchからアクセスする方法は以下のページを参照してみてください。
利用するGo パッケージ
Go パッケージは以下の「go-sql-driver/mysql」を使います。予め「go get」しておきましょう。
go get -u github.com/go-sql-driver/mysql
Go は「database/sql」パッケージを通じて、Driver化された各種DBに接続するので、基本的な操作方法は「database/sql」に依存します。
個人的にこのRDB接続用の汎用的なインターフェースを備えている点は、Go言語の好きな部分です。
CData Connect にSalesforce データを接続
Goで作業を始める前にまずCData Connect側の準備をしてしまいましょう。
CData Connect (旧CloudHub) のアカウントを取得します。CData Connect はSaaS ですので、アカウントを取得したらインストールやホスティングなどなく、ブラウザからログインすることですぐに使用開始です。
早速ブラウザからCData Connect にログインします。「DATABASE」タブから仮想データベースを設定していきます。まずは接続するデータソースであるSalesforce のアイコンをクリックします。
データソース接続画面が開くので、データソース毎の認証情報を入力します。Salesforce の場合はUser、Password、Security Token を入力することでデータにアクセスすることができます。
次に「ENDPOINTS」タブで、このデータをどのインターフェースのエンドポイントして公開するかを選択します。デフォルトで、OData、MySQL wire protocol、TDS(SQL Server) wire Protocol がすべて有効になっています。
必要があればアクセスを許可する信頼されたIP アドレスを指定することも可能です。
最後に公開したデータにアクセスできるユーザーとトークンを作成します。「USERS」タブからユーザーを作成するとトークンが生成されます。
これでCData Connect でSalesforce データを扱う準備ができました。
Go から CData Connectに接続
それでは実際に Go で CData Connect に接続してみましょう。
接続設定はMySQLに接続する方法と一緒です。予め作成したユーザーID・パスワードとCData ConnectのMySQL エンドポイントをTCPで指定して接続します。
注意点としては、エンドポイントがTLSになっているので「?tls=true」を指定しておくことです。
db, err := sql.Open("mysql", "USER_NAME:PASSWORD@tcp(TENANT_NAME.cdatacloud.net:3306)/Salesforce1?tls=true")
あとは「database/sql」のクエリ方法に従って、SQLを発行するだけです。
https://golang.org/pkg/database/sql/#DB.Query
今回はSalesforceの取引先(Account)のデータを取得してみました。
package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" ) func main() { fmt.Println("Connect to CData Connect by MySQL Wire protocol") db, err := sql.Open("mysql", "USER_NAME:PASSWORD@tcp(TENANT_NAME.cdatacloud.net:3306)/Salesforce1?tls=true") if err != nil { fmt.Println(err.Error()) return } defer db.Close() rows, err := db.Query("SELECT Id,Name from Account limit 10") if err != nil { fmt.Println(err.Error()) return } for rows.Next() { var account Account rows.Scan(&account.Id, &account.Name) fmt.Printf("%s \n", account) } } type Account struct { Id string Name string }
以下のように結果が表示されればOKです。
Connect to CData Connect by MySQL Wire protocol {0012800000tNPqdAAG CData Software Japan LLC} {00128000008KCGYAA4 GenePoint} {00128000008KCGWAA4 United Oil & Gas, UK} {00128000008KCGXAA4 United Oil & Gas, Singapore} {00128000008KCGOAA4 Edge Communications} {00128000008KCGPAA4 Burlington Textiles Corp of America} {00128000008KCGQAA4 Pyramid Construction Inc.} {00128000008KCGRAA4 Dickenson plc} {00128000008KCGSAA4 Grand Hotels & Resorts Ltd} {00128000008KCGUAA4 Express Logistics and Transport 23}