# Cloud Spanner ## Specification - https://cloud.google.com/blog/ja/products/databases/spanner-relational-database-for-all-size-applications-faqs - https://qiita.com/pa_pa_geno/items/c5fc5ea0d5daf415080d - http://wild-data-chase.com/index.php/2020/08/10/post-941/ - https://gweb-cloudblog-slim.appspot.com/blog/ja/topics/developers-practitioners/tips-migrating-mysql-cloud-spanner - https://cloud.google.com/spanner/docs/schema-and-data-model - https://cloud.google.com/architecture/migrating-mysql-to-spanner?hl=ja - https://cloud.google.com/spanner/docs/best-practice-list?hl=ja ## DDL DDL : Data Definition Language https://cloud.google.com/spanner/docs/data-definition-language TODO: copy description ## DML DML : Data Manipulation Language https://cloud.google.com/spanner/docs/dml-syntax TODO: copy descriptions ## DML-mutation https://cloud.google.com/spanner/docs/dml-versus-mutations?hl=ja ## DML-partition DML https://cloud.google.com/spanner/docs/dml-partitioned ## Getting started in Go https://cloud.google.com/spanner/docs/getting-started/go ## 設計 [Cloud Spannerの主キーの設計. Spannerがパフォーマンスを発揮するには主キーの設計が非常に重要です。そこで… | by Toyohito Murooka | google-cloud-jp | Medium](https://medium.com/google-cloud-jp/cloud-spannerの主キーの設計-bfb5ce2f54b9) ## Local development ### Emulator [Using the Cloud Spanner Emulator  |  Google Cloud](https://cloud.google.com/spanner/docs/emulator) ### docker-compose [Cloud Spannerのローカル開発環境をdocker-composeでサクッと立ち上げる | フューチャー技術ブログ](https://future-architect.github.io/articles/20210323/) TODO: 必見 ## Driver ### go-sql-driver-spanner https://github.com/rakyll/go-sql-driver-spanner ⬇️上URLからコピーする Google Cloud Spanner driver for Go's database/sql package. THIS IS A WORK-IN-PROGRESS, DON'T USE IT IN PRODUCTION YET. ## Migration ### wrench https://chidakiyo.hatenablog.com/entry/gcp-spanner-wrench > hammer は ALTER 文の生成までツールでやってくれていましたが、 wrench はあくまでも DDL はユーザが記述し、 wrench は適用した DDL のバージョンの管理まで、という感じで似たようなツールではありますが、やれることが割と違います。 > > wrench のほうが暗黙でやっていることが少ないので、 本番運用に使うツールとしては wrench が良さそうで、 > 開発時に、テーブルスキーマを軸に修正しつつコツコツ作業したい場合には hammer が便利なんじゃないかと思ったりしました。 ### Ratchet https://qiita.com/hiracchy/items/bb570b16c654ba2f276f https://github.com/hiracchy/ratchet - wrench - マイグレーションファイルの名前が連番で作られるため、複数人の開発で競合する - DMLやパーティション化DMLへの対応がない(現在は、一部対応があるようです) ### migrate https://github.com/golang-migrate/migrate https://github.com/golang-migrate/migrate/tree/master/database/spanner ## コード生成 ### Yo メルペイ https://engineering.mercari.com/blog/entry/2018-11-22-112423/ https://github.com/cloudspannerecosystem/yo - xo(発想元) - コード生成ツール - [[MySQL]], PostgreSQL, Oracle... - database/sqlを直接扱う単純なコードを生成 - 見通しが良い - [[Tech 🧠/Language/Go/Go]] のtemplate機能でカスタマイズ可能 - indexを考慮したクエリとコードも生成 - 複雑なクエリは生成できない - JOINなど - 手書きする - Yo - テーブル毎に1ファイル - テーブル名からstructを生成 - Insert/Update/DeleteなどはMutationを返す - SELECT文では*を使わずにカラム名を全て指定 - セカンダリーインデックスから FindXXXByYYY というメソッドを生成 (XXXはテーブル名, YYYはインデックス名) - Readを使わずにQueryで取得するので全てのカラムを取得 - ReadWriteTransaction/ReadOnlyTransactionを両方使えるようにinterfaceで受けている - template機能 - プロジェクト毎にカスタマイズ - まだ機能足りない - xoと同程度の使い勝手 - ArrayやStructなどへの対応 - Readを使った最適参照 - DMLの対応 ## ORM ### Spanner-ORM https://github.com/leapfrogtechnology/spanner-orm