先日 Spanner のスキーマ管理ツール hammer を利用した ブログ を書きましたが、
Cloud Spanner Echosystem から wrench というツールが提供されていることに気づきました。
hammer 最近更新されてないのかな(?)、と思いながら試していたところもあるので、今回はこちらの wrench を試してみます。
手順そのものは公式の ドキュメント にほぼ沿ったものになります
wrench のインストール
go get -u github.com/cloudspannerecosystem/wrench
wrench
を実行することで色々表示が出れば成功。
(何故か hammer もそうでしたが、 wrench も -v オプションでバージョンを見ようとすると unknown と表示されます・・・)
環境変数に接続情報をもたせる
以下のような環境変数を事前に登録します
export SPANNER_PROJECT_ID=your-project-id export SPANNER_INSTANCE_ID=your-instance-id export SPANNER_DATABASE_ID=your-database-id
スキーマファイルを用意する
最初にまずスキーマのファイルを用意します。
今回は _ddl
というディレクトリを利用しようと思います。
作成するファイルは以下のようになります
cat ./_ddl/schema.sql
CREATE TABLE users ( user_id STRING(36) NOT NULL, ) PRIMARY KEY(user_id);
スキーマを適用する
以下のコマンドで DB にスキーマを適用します。
事前にすでに DB が存在している場合にはコマンドがエラーになるので注意してください。
wrench create --directory ./_ddl
コマンド実行が成功すると、 database と table が作成されます。
マイグレーションファイルを作成する
コマンドを実行してマイグレーションファイルのテンプレートを作成します。
wrench migrate create --directory ./_ddl
_ddl/migrations/000001.sql is created
と表示され、 {連番}.sql
という空のファイルが作成されます。
カラムの変更を migrate ファイルに記述する
試しに新しいカラムを追加してみましょう。
先程生成された {連番}.sql ファイルに対して以下のように記述します。
ALTER TABLE users ADD COLUMN age INT64 ALTER TABLE users ADD COLUMN name STRING(MAX) ALTER TABLE users ALTER COLUMN name STRING(MAX) NOT NULL CREATE INDEX idx_users_name ON users(name)
マイグレーションの実行
以下のコマンドでマイグレーションを実行します
wrench migrate up --directory ./_ddl
1/up
などと表示されれば成功です。
schema.sql に DB 内のスキーマを反映する
この段階ではローカルの schema.sql はマイグレートした内容を反映していないので、wrench コマンドを使って最新化してみます。
wrench load --directory ./_ddl
コマンドが成功すると、 schema.sql ファイルの中身は以下のように更新されてるはずです。
CREATE TABLE SchemaMigrations ( Version INT64 NOT NULL, Dirty BOOL NOT NULL, ) PRIMARY KEY(Version); CREATE TABLE users ( user_id STRING(36) NOT NULL, age INT64, name STRING(MAX) NOT NULL, ) PRIMARY KEY(user_id); CREATE INDEX idx_users_name ON users(name);
注意点としては、スキーマ管理用のテーブル SchemaMigrations
も併せて生成されています。
Spanner のコンソールから確認するとわかりますが、最後に適用したマイグレーションファイルの番号がそのテーブルに追加されていることがわかります。
まとめ
hammer は ALTER 文の生成までツールでやってくれていましたが、 wrench はあくまでも DDL はユーザが記述し、 wrench は適用した DDL のバージョンの管理まで、という感じで似たようなツールではありますが、やれることが割と違います。
wrench のほうが暗黙でやっていることが少ないので、 本番運用に使うツールとしては wrench が良さそうで、
開発時に、テーブルスキーマを軸に修正しつつコツコツ作業したい場合には hammer が便利なんじゃないかと思ったりしました。
ではでは。