- MySQLを使用したAPI開発であるこちらのプロジェクトをCloud Spanner向けに改修
old/new | project | DB |
---|---|---|
old | memo_sample | MySQL |
new | memo_sample_spanner | Cloud Spanner |
- tag, memoテーブルの主キーをint⇒string(36)に変更
- 主キー生成にUUID(v4)を使用するため
- こちらを参照
各トランザクション内でも、シングルアクセス(client.Single())でも開発者は共通のRepository、UseCaseメソッドを使用することができる
- ReadWriteTransaction内でDBAを使用すれば、ReadWriteTransaction内でクエリが実行される
- ReadOnlyTransaction内でDBAを使用すれば、ReadOnlyTransaction内でクエリが実行される
- BatchReadOnlyTransaction内でDBAを使用すれば、BatchReadOnlyTransaction内でクエリが実行される
- 上記以外で使用すれば、Single()としてクエリが実行される
使用例(ReadWriteTransactionとSingle)
_, err := i.tx.ReadWriteTransaction(ctx,
func(ctx context.Context) error {
_, err := i.memo.Post(ctx, ipt) // ReadWriteTransaction内で登録クエリ発行
return err
},
)
_, err := i.memo.Post(ctx, ipt) // client.Single()で登録クエリ発行
使用例(ReadOnlyTransactionとSingle)
err := i.tx.ReadOnlyTransaction(ctx, func(ctx context.Context) error {
memos, tags, err := i.memo.SearchTagsAndMemos(ctx, ipt) // ReadOnlyTransaction内で検索クエリ発行
// 後続処理
})
memos, tags, err := i.memo.SearchTagsAndMemos(ctx, ipt) // client.Single()で検索クエリ発行
またRDBとCloud Spannerではトランザクションの種類と接続方法が異なるので、Cloud Spannerに合う形に対応するため下記のような構成にしている
- old (for RDB)
- new (for Cloud Spanner)
-
トランザクションかシングルアクセス(client.Single())に振り分けを共通処理で行っている
- よって各Repository内のメソッド内では意識しなくていいつくり
- つまりトランザクションでもそうでなくても同一のRepositoryメソッドが使用可能
-
https://github.com/muroon/memo_sample_spanner/blob/master/infra/cloudspanner/db.go#L161
こちらに記載