こんにちは。CData Software Japanリードエンジニアの杉本です。
このBlogでもちょくちょく紹介しているCData Connect はSalesforce や KintoneなどのクラウドサービスAPIに接続するためのプロトコルとしてTDS(SQL Server)・MySQL(MySQL Wire protocol)・ODataの3種類をサポートしています。
www.cdata.com
通常であれば、以下のBlogのようにBIツールやローコードサービスが持つMySQLインターフェースを通じて活用するのが主な利用シナリオですが、各種プログラミング言語から直接それぞれのインターフェースを使うことももちろん可能です。
www.cdatablog.jp
というわけで今回はプリミティブな使い方として、Go言語からMySQL Wire protocolを通じて、Salesforce のデータにアクセスする方法を紹介したいと思います。
なお、MySQL Workbenchからアクセスする方法は以下のページを参照してみてください。
www.cdatablog.jp
利用するGo パッケージ
Go パッケージは以下の「go-sql-driver/mysql」を使います。予め「go get」しておきましょう。
github.com
go get -u github.com/go-sql-driver/mysql
Go は「database/sql」パッケージを通じて、Driver化された各種DBに接続するので、基本的な操作方法は「database/sql」に依存します。
golang.org
個人的にこの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}
ソースコード
github.com
関連コンテンツ