寝ても覚めてもこんぴうた

プログラム書いたり、ネットワーク設計したり、サーバ構築したり、車いじったり、ゲームしたり。そんなひとにわたしはなりたい。 投げ銭は kyash_id : chidakiyo マデ

Spanner のスキーマ管理をする wrench を試してみた

f:id:chidakiyo:20200903171222j:plain

先日 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 が便利なんじゃないかと思ったりしました。

ではでは。