デベロッパー

Golang の database/sql ドライバでの Cloud Spanner サポートの一般提供を開始

※この投稿は米国時間 2022 年 9 月 15 日に、Google Cloud blog に投稿されたものの抄訳です。 

概要

Go SQL Spanner ドライバは、Go の database/sql/driver インターフェースの実装です。ドライバをアプリケーションに追加することで、Cloud Spanner で database/sql API の使用が可能となります。spanner を driverName として、有効な接続文字列を dataSourceName として使用します。

  import _ "github.com/googleapis/go-sql-spanner"

db, err := sql.Open("spanner", "projects/PROJECT/instances/INSTANCE/databases/DATABASE")
if err != nil {
    log.Fatal(err)
}

// Print Singers with ID greater than 500.
rows, err := db.QueryContext(ctx, "SELECT SingerId, FirstName FROM Singers WHERE SingerId > @id", 500)
if err != nil {
    log.Fatal(err)
}
defer rows.Close()

var (
    singerID   int64
    firstName string
)
for rows.Next() {
    if err := rows.Scan(&singerID, &firstName); err != nil {
        log.Fatal(err)
    }
    fmt.Println(singerID, firstName)
}

インストール

シェルから go ツール$GOPATH に簡単にパッケージをインストールします。
  $ go get -u github.com/googleapis/go-sql-spanner

マシンとシステムの PATH に Git がインストールされていることを確認してください。

アーキテクチャ

Spanner の database/sql ドライバでは、セッション管理、データのエンコードとデコード、トランザクション管理のために、Google Cloud Spanner 向けの Go クライアント ライブラリを使用します。
Spanner Go SQL Driver

接続文字列

接続文字列とは、データソースとそれに接続するための方法についての情報を指定する文字列のことです。接続を開始するための文字列の情報は、基盤となるドライバまたはプロバイダにコードとして渡されます。


Cloud Spanner の一般的な接続文字列は、完全修飾されたデータベース名とオプションのパラメータ リストで構成されています。

  projects/my-project/instances/my-instance/databases/my-database?credentials=/path/to/credentials.json

また、接続文字列にはホストとポート番号を含めることもできます。これは、カスタム エンドポイント(インメモリ モック サーバーなど)への接続に使用でき、文字列は次のようになります。

  127.0.0.1:55217/projects/p/instances/i/databases/d?useplaintext=true;

完全な接続文字列の正規表現は、次のようになります。

  ((?P<HOSTGROUP>[\w.-]+(?:\.[\w\.-]+)*[\w\-\._~:/?#\[\]@!\$&'\(\)\*\+,;=.]+)/)?projects/(?P<PROJECTGROUP>(([a-z]|[-.:]|[0-9])+|(DEFAULT_PROJECT_ID)))(/instances/(?P<INSTANCEGROUP>([a-z]|[-]|[0-9])+)(/databases/(?P<DATABASEGROUP>([a-z]|[-]|[_]|[0-9])+))?)?(([\?|;])(?P<PARAMSGROUP>.*))?

なお、Spanner への接続のために Go クライアントを使用するドライバの場合、Spanner エミュレータへの接続にカスタム エンドポイントを指定する必要はありません。SPANNER_EMULATOR_HOST の環境変数が設定されていれば、エミュレータは自動でドライバに接続されます。

使用方法

ステートメント

ドライバは、名前付きパラメータと位置パラメータの両方をサポートしています。名前付きパラメータはアンパサンド(@)で始まります。位置パラメータは疑問符(?)を使って表されます。

  db.QueryContext(ctx, "SELECT SingerId, FirstName FROM Singers WHERE SingerId = @id", 14544498215374)

db.ExecContext(ctx, "INSERT INTO Singers (SingerId, FirstName, LastName) VALUES (@id, @firstName, @lastName)", id, firstName, lastName)

db.ExecContext(ctx, "DELETE FROM Singers WHERE SingerId = ?", 14544498215374)

DDL ステートメント

Cloud Spanner の制限にあるように、トランザクションでは DDL ステートメントはサポートされていません。その代わりに、アクティブなトランザクションなしで、接続上で DDL ステートメントを実行することが可能です。

  db, _ := sql.Open("spanner", "projects/PROJECT/instances/INSTANCE/databases/DATABASE")
db.ExecContext(ctx, "CREATE TABLE ...")

ここでは、実行スピードの最適化のために、複数の DDL ステートメントをまとめてバッチ処理することが推奨されています。DDL バッチとして定義することで、複数の DDL ステートメントを Cloud Spanner に 1 つのバッチとして送信できます。

  conn, _ := db.Conn(ctx)
// Executing `START BATCH DDL` will initialize a DDL batch.
// Subsequent statements must all be DDL until `RUN BATCH` or `ABORT BATCH` is executed.
_, _ = conn.ExecContext(ctx, "START BATCH DDL")

// This will be cached locally until a `RUN BATCH` statement is executed.
_, _ = conn.ExecContext(ctx, `CREATE TABLE Singers (
     SingerId INT64,
     FirstName STRING(MAX),
     LastName STRING(MAX),
) PRIMARY KEY (SingerId)`)


_, _ = conn.ExecContext(ctx, "CREATE INDEX Idx_Singers_Name ON Singers (Name)")

// Executing `RUN BATCH` will run the previous DDL statements as one batch.
_, _ := conn.ExecContext(ctx, "RUN BATCH")

また、バッチ DDL の例で確認することもできます。

制限事項

ドライバでサポートされていない Cloud Spanner の機能は、こちらに一覧化されています。

ご協力のお願い

特に、Cloud Spanner を検討している Golang のデベロッパーや、新規プロジェクトに database/sql の使用を検討されている Cloud Spanner の既存のお客様からのご意見をお待ちしています。このプロジェクトはオープンソースのため、GitHub でコメント、バグレポート、pull リクエストを行うことができます。

関連情報

始める前に、golang プロジェクトを用意する必要があります。例の詳細については、ドライバの examples ディレクトリをご覧ください。また、以下もご参照ください。


- Google Cloud ソフトウェア エンジニア Rahul Yadav