# 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