目標
このチュートリアルでは、Spanner ADO.NET ドライバを使用して以下の手順について説明します。
- Spanner のインスタンスとデータベースを作成します。
- データベースのデータに対し、書き込み、読み取り、SQL クエリの実行を行います。
- データベース スキーマを更新します。
- 読み取り / 書き込みトランザクションを使用してデータを更新します。
- セカンダリ インデックスをデータベースに追加します。
- インデックスを使用して、データの読み込みと SQL クエリの実行を行います。
- 読み取り専用トランザクションを使用してデータを取得します。
費用
このチュートリアルでは、Google Cloudの課金対象コンポーネントである Spanner を使用します。Spanner の使用料金については、料金についてのページをご覧ください。
始める前に
設定で説明されている手順を終わらせておきます。この手順では、デフォルトの Google Cloud プロジェクトの作成と設定、課金の有効化、Cloud Spanner API の有効化、Cloud Spanner API の使用に必要な認証情報を取得するための OAuth 2.0 の設定を行います。
特に、gcloud auth
application-default login を使用したローカル開発環境の認証情報の設定は必ず行ってください。
ローカルの ADO.NET 環境を準備する
まだインストールしていない場合は、開発マシンに .NET をダウンロードしてインストールします。
ローカルマシンにサンプル リポジトリのクローンを作成します。
git clone https://github.com/googleapis/dotnet-spanner-entity-framework.gitSpanner ADO.NET ドライバのサンプルコードが含まれているディレクトリに移動します。
cd dotnet-spanner-entity-framework/spanner-ado-net/spanner-ado-net-getting-started-guide
インスタンスの作成
Spanner を最初に使用する際は、インスタンスを作成する必要があります。インスタンスとは、Spanner データベースによって使用されるリソースの割り当てのことです。インスタンスの作成時には、インスタンス構成を選択してデータの格納場所を指定し、さらに使用するノード数も選択してインスタンスの配信リソースおよびストレージ リソースの量を決定します。
次のいずれかの方法で Spanner インスタンスを作成する方法については、インスタンスを作成するをご覧ください。インスタンスに test-instance という名前を付けることで、このドキュメント内の他のトピックで test-instance という名前のインスタンスを参照している箇所と関連付けて使用できます。
- Google Cloud CLI
- Google Cloud コンソール
- クライアント ライブラリ(C++、C#、Go、Java、Node.js、PHP、Python、Ruby)
サンプル ファイルの確認
サンプル リポジトリには、ADO.NET で Spanner を使用する方法を示すサンプルが含まれています。
SampleRunner.cs ファイルを見ると、Spanner の使用方法を確認できます。このファイルのコードでは、新しいデータベースを作成して使用する方法が示されています。データで使用しているサンプル スキーマは、スキーマとデータモデルのページにあります。データベースを作成する
GoogleSQL
gcloud spanner databases create example-db --instance=test-instance
PostgreSQL
gcloud spanner databases create example-db --instance=test-instance \
--database-dialect=POSTGRESQL
次のように表示されます。
Creating database...done.
テーブルを作成する
次のコードを実行すると、データベースに 2 つのテーブルが作成されます。
GoogleSQL
PostgreSQL
次のコマンドを使用してサンプルを実行します。
GoogleSQL
dotnet run createtables projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run createtablespg projects/PROJECT_ID/instances/test-instance/databases/example-db
次のステップでは、データベースにデータを書き込みます。
接続を作成する
読み取りまたは書き込みを行うには、Spanner とやり取りするための接続を作成する必要があります。データベース名とその他の接続プロパティは、ADO.NET 接続文字列で指定されます。GoogleSQL
PostgreSQL
DML を使用してデータを書き込む
読み取り / 書き込みトランザクションでデータ操作言語(DML)を使用してデータを挿入できます。
DbCommand#ExecuteNonQuery メソッドを使用して DML ステートメントを実行します。
GoogleSQL
PostgreSQL
次のコマンドを使用してサンプルを実行します。
GoogleSQL
dotnet run dmlwrite projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run dmlwritepg projects/PROJECT_ID/instances/test-instance/databases/example-db
結果は次のようになります。
4 records inserted.
ミューテーションを使用してデータを書き込む
ミューテーションを使ってデータを挿入することもできます。
データを挿入するには、batch.CreateInsertCommand() メソッドを使用します。このメソッドでは、行をテーブルに挿入するための新しい SpannerBatchCommand を作成します。SpannerBatchCommand.ExecuteNonQueryAsync() メソッドを使用すると、テーブルに新しい行を追加できます。
次のコードは、ミューテーションを使用してデータを書き込む方法を示しています。
GoogleSQL
PostgreSQL
write 引数を使用して次の例を実行します。
GoogleSQL
dotnet run write projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run writepg projects/PROJECT_ID/instances/test-instance/databases/example-db
SQL を使用したデータのクエリ
Spanner では、データの読み取り用に SQL インターフェースがサポートされています。このインターフェースにアクセスするには、コマンドラインで Google Cloud CLI を使用するか、プログラムで Spanner ADO.NET ドライバを使用します。
コマンドラインから
Albums テーブルのすべての列から値を読み取るには、次の SQL ステートメントを実行します。
GoogleSQL
gcloud spanner databases execute-sql example-db --instance=test-instance \
--sql='SELECT SingerId, AlbumId, AlbumTitle FROM Albums'
PostgreSQL
gcloud spanner databases execute-sql example-db --instance=test-instance \
--sql='SELECT singer_id, album_id, album_title FROM albums'
結果は次のようになります。
SingerId AlbumId AlbumTitle
1 1 Total Junk
1 2 Go, Go, Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
Spanner ADO.NET ドライバを使用する
コマンドラインで SQL ステートメントを実行するだけでなく、Spanner ADO.NET ドライバを使用して、同じ SQL ステートメントをプログラマティックに実行できます。
SQL クエリの実行には次のメソッドが使用されます。DbCommandクラスのExecuteReaderメソッド: クエリやTHEN RETURN句を含む DML ステートメントなど、行を返す SQL ステートメントを実行します。DbDataReaderクラス: SQL ステートメントから返されたデータにアクセスするために使用します。
次の例では、ExecuteReaderAsync メソッドを使用します。
GoogleSQL
PostgreSQL
次のコマンドを使用してサンプルを実行します。
GoogleSQL
dotnet run query projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run querypg projects/PROJECT_ID/instances/test-instance/databases/example-db
結果は次のようになります。
1 1 Total Junk
1 2 Go, Go, Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
SQL パラメータを使用したクエリ
頻繁に実行されるクエリがアプリケーションにある場合は、対象のクエリをパラメータ化してパフォーマンスを改善できます。パラメータ クエリをキャッシュに保存して再利用できます。これにより、コンパイルの費用を削減できます。詳細については、クエリ パラメータを使用して、頻繁に実行するクエリを高速化するをご覧ください。
次の例では、WHERE 句のパラメータを使用して、LastName の特定の値を含むレコードをクエリします。
Spanner ADO.NET ドライバは、位置パラメータと名前付きクエリ パラメータの両方をサポートしています。SQL ステートメントの ? は、位置クエリ パラメータを示します。DbCommand の Parameters にクエリ パラメータの値を指定します。次に例を示します。
GoogleSQL
PostgreSQL
次のコマンドを使用してサンプルを実行します。
GoogleSQL
dotnet run querywithparameter projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run querywithparameterpg projects/PROJECT_ID/instances/test-instance/databases/example-db
結果は次のようになります。
12 Melissa Garcia
データベース スキーマを更新する
MarketingBudget という列を新たに Albums テーブルに追加する必要があるとします。既存のテーブルに新しい列を追加するには、データベース スキーマの更新が必要です。Spanner では、データベースでのトラフィックの処理中にデータベースのスキーマを更新できます。スキーマの更新では、データベースをオフラインにする必要がなく、テーブル全体あるいは列全体をロックすることもありません。スキーマの更新中もデータベースへのデータの書き込みを続けることができます。サポートされるスキーマの更新とスキーマ変更のパフォーマンスの詳細については、スキーマを更新するをご覧ください。
列の追加
列を追加するには、コマンドラインで Google Cloud CLI を使用するか、プログラムで Spanner ADO.NET ドライバを使用します。
コマンドラインから
テーブルに新しい列を追加するには、次の ALTER TABLE コマンドを使用します。
GoogleSQL
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='ALTER TABLE Albums ADD COLUMN MarketingBudget INT64'
PostgreSQL
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='alter table albums add column marketing_budget bigint'
以下のように表示されます。
Schema updating...done.
Spanner ADO.NET ドライバを使用する
スキーマを変更するには、ExecuteNonQueryAsync メソッドを使用します。
GoogleSQL
PostgreSQL
次のコマンドを使用してサンプルを実行します。
GoogleSQL
dotnet run addcolumn projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run addcolumnpg projects/PROJECT_ID/instances/test-instance/databases/example-db
結果は次のようになります。
Added MarketingBudget column.
DDL バッチを実行する
複数のスキーマ変更は 1 つのバッチで実行することをおすすめします。ADO.NET の CreateBatch メソッドを使用してバッチを作成します。次の例では、1 つのバッチで 2 つのテーブルを作成します。
GoogleSQL
PostgreSQL
次のコマンドを使用してサンプルを実行します。
GoogleSQL
dotnet run ddlbatch projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run ddlbatchpg projects/PROJECT_ID/instances/test-instance/databases/example-db
結果は次のようになります。
Added Venues and Concerts tables.
新しい列にデータを書き込む
次のコードは、新しい列にデータを書き込みます。MarketingBudget の値を、キーが Albums(1, 1) の行は 100000 に、キーが Albums(2, 2) の行は 500000 に設定します。
GoogleSQL
PostgreSQL
次のコマンドを使用してサンプルを実行します。
GoogleSQL
dotnet run update projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run updatepg projects/PROJECT_ID/instances/test-instance/databases/example-db
結果は次のようになります。
Updated 2 albums
さらに、SQL クエリを実行して、書き込んだばかりの値を取得することもできます。
次の例では、ExecuteReaderAsync メソッドを使用してクエリを実行します。
GoogleSQL
PostgreSQL
このクエリを実行するには、次のコマンドを実行します。
GoogleSQL
dotnet run querymarketingbudget projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run querymarketingbudgetpg projects/PROJECT_ID/instances/test-instance/databases/example-db
次のように表示されます。
1 1 100000
1 2 null
2 1 null
2 2 500000
2 3 null
データの更新
読み取り / 書き込みトランザクションで DML を使用してデータを更新できます。
connection.BeginTransactionAsync() を呼び出して、ADO.NET で読み取り / 書き込みトランザクションを実行します。
GoogleSQL
PostgreSQL
次のコマンドを使用してサンプルを実行します。
GoogleSQL
dotnet run writewithtransactionusingdml projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run writewithtransactionusingdmlpg projects/PROJECT_ID/instances/test-instance/databases/example-db
トランザクション タグとリクエストタグ
Spanner のトランザクションとクエリのトラブルシューティングを行うには、トランザクション タグとリクエストタグを使用します。Transaction オブジェクトにタグを設定してトランザクション タグを送信し、DbCommand オブジェクトにタグを設定してリクエストタグを Spanner に送信できます。次に例を示します。
GoogleSQL
PostgreSQL
次のコマンドを使用してサンプルを実行します。
GoogleSQL
dotnet run tags projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run tagspg projects/PROJECT_ID/instances/test-instance/databases/example-db
読み取り専用トランザクションを使用したデータの取得
同じタイムスタンプで複数の読み取りを実行する場合について考えます。読み取り専用トランザクションはトランザクションの commit 履歴の整合性のあるプレフィックスを監視しているので、アプリケーションは常に整合性のあるデータを取得できます。読み取り専用トランザクションを実行するには、connection.BeginReadOnlyTransactionAsync() を呼び出します。
同じ読み取り専用トランザクションでクエリと読み取りを実行する方法を次に示します。
GoogleSQL
PostgreSQL
次のコマンドを使用してサンプルを実行します。
GoogleSQL
dotnet run readonlytransaction projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run readonlytransactionpg projects/PROJECT_ID/instances/test-instance/databases/example-db
結果は次のようになります。
1 1 Total Junk
1 2 Go, Go, Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
2 2 Forever Hold Your Peace
1 2 Go, Go, Go
2 1 Green
2 3 Terrified
1 1 Total Junk
パーティション化 DML
パーティション化されたデータ操作言語(DML)は、次のタイプの一括更新と一括削除用に設計されています。
- 定期的なクリーンアップとガベージ コレクション。
- デフォルト値での新しい列のバックフィリング。
GoogleSQL
PostgreSQL
次のコマンドを使用してサンプルを実行します。
GoogleSQL
dotnet run pdml projects/PROJECT_ID/instances/test-instance/databases/example-db
PostgreSQL
dotnet run pdmlpg projects/PROJECT_ID/instances/test-instance/databases/example-db
クリーンアップ
このチュートリアルで使用したリソースについて Cloud 請求先アカウントに課金されないようにするため、作成したデータベースとインスタンスを削除します。
データベースの削除
インスタンスを削除すると、それに含まれるすべてのデータベースが自動的に削除されます。このステップでは、インスタンスを削除しないでデータベースを削除する方法を示します(インスタンスの料金は引き続き発生します)。
コマンドラインから
gcloud spanner databases delete example-db --instance=test-instance
Google Cloud コンソールの使用
Google Cloud コンソールの [Spanner インスタンス] ページに移動します。
インスタンスをクリックします。
削除するデータベースをクリックします。
[データベースの詳細] ページで [削除] をクリックします。
データベースを削除することを確認し、[削除] をクリックします。
インスタンスの削除
インスタンスを削除すると、そのインスタンスで作成されたすべてのデータベースが自動的に削除されます。
コマンドラインから
gcloud spanner instances delete test-instance
Google Cloud コンソールの使用
Google Cloud コンソールの [Spanner インスタンス] ページに移動します。
インスタンスをクリックします。
[削除] をクリックします。
インスタンスを削除することを確認し、[削除] をクリックします。
次のステップ
仮想マシン インスタンスで Spanner にアクセスする方法を確認する。
クライアント ライブラリを使用して Cloud サービスに対する認証を行うで、認可と認証について確認する。
Spanner のスキーマ設計のベスト プラクティスを確認する。