CData Software Blog

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

Go-MySQL-Driver を使って Salesforce のデータをCData Connect 経由で取得してみる:CData Connect MySQL Wire protocol

f:id:sugimomoto:20210407095504p:plain

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

このBlogでもちょくちょく紹介しているCData Connect はSalesforce や KintoneなどのクラウドサービスAPIに接続するためのプロトコルとしてTDSSQL Server)・MySQLMySQL 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 のアイコンをクリックします。

f:id:cdatasoftware:20201016155823p:plain

データソース接続画面が開くので、データソース毎の認証情報を入力します。Salesforce の場合はUser、Password、Security Token を入力することでデータにアクセスすることができます。

f:id:cdatasoftware:20201016155923p:plain

次に「ENDPOINTS」タブで、このデータをどのインターフェースのエンドポイントして公開するかを選択します。デフォルトで、OData、MySQL wire protocol、TDS(SQL Server) wire Protocol がすべて有効になっています。

必要があればアクセスを許可する信頼されたIP アドレスを指定することも可能です。

f:id:cdatasoftware:20201014212922p:plain

最後に公開したデータにアクセスできるユーザーとトークンを作成します。「USERS」タブからユーザーを作成するとトークンが生成されます。

f:id:cdatasoftware:20201014212650p:plain

これで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