前回の記事で個人アプリのデータベースを Planet Scale に移行した話を記事にしました。
今回はそれを運用するにあたってデータベースのスキーマを変更しました。その際のマイグレーションで Docker を使って開発していたことが原因でハマったのでそれについて記事にしていきたいと思います。
マイグレーションのやり方
基本的には公式ドキュメントに従ってやればできます。
前提知識
Rails アプリケーションはマイグレーションを実行すると、schema_migrations テーブルにタイムスタンプが保存されていく仕組みになっています。
mysql> SELECT * FROM schema_migrations;
+----------------+
| version |
+----------------+
| 20221201132430 |
| 20221201144156 |
| 20221207080242 |
+----------------+
Rails アプリケーションで rails db:migrate
を行うと以下のようなことが行われます。
- schema_migrations テーブルを照会して、どのマイグレーションが未実行なのかを確認
- schema_migrations テーブルに表示されないマイグレーションは保留とみなされ、マイグレーションが実行
これらを踏まえて、さっそくやっていきます!
手順
CLI でブランチを作成
Planet Scale ではブランチの概念があり、別のサーバーに main のデータベースのコピーを作成して、それに対してマイグレーションを行い、最後に main と同期 (デプロイ) する方法が取られています。
まずは、main のデータベースをコピーします。
$ pscale branch create database_name branch_name
次に、きちんと作られたかどうかを確認します。
$ pscale shell database_name branch_name
$ select * from schema_migrations;
ローカルのデータベース環境を作成したブランチの環境と接続し、マイグレーションを実行する
確認ができたら pscale connectを使用して、作成したブランチの環境と接続しておきます。
$ pscale connect database_name branch_name --port 3309
次に、作成したブランチにローカルのデータベースを接続するため、database.yml
を書き換えます。
development:
<<: *default
# For Planet Scale
adapter: mysql2
database: database_name
host: host.docker.internal
port: 3309
ここで、Docker を使っている場合は指定するホスト名に注意が必要です。
ドキュメントでは 127.0.0.1 となっていますが、これはループバックアドレスを指していて自分自身のコンピューターを表すために使用されます。ですので、Docker の場合は Docker で立ち上げたコンテナ自身を指してしまいます。
コンテナからそれを立ち上げているホストを指定するには host.docker.internal
を指定すればいいようです。
接続情報の変更ができたらいよいよマイグレーションをして、確認までします。
docker compose --rm mucha bundle exec rails db:migrate
pscale shell database_name branch_name
database_name/branch_name> select * from schema_migrations;
本番のデータベースにデプロイする
ここまできたら後は作成したブランチの内容を main と同期 (デプロイ) します。
$ pscale deploy-request create database_name branch_name
Deploy request #1 successfully created.
$ pscale deploy-request deploy database_name 1
Successfully queued lkqomtsgelev from branch_name for deployment to main.
最後に本番のデータベースが変更されていることを確認して完了です!
さいごに
Rails の通常のマイグレーションとやり方が違うので、少し戸惑いましたが何とかマイグレーションすることができました。
一連の作業に時間がかかるので、本番のコードを当ててからデータベースのスキーマを変えるまでに15分くらいのダウンタイムができてしまうので、そこは意識しておかないといけないと思いました。
自動化したいですけど、中々大変そうでここが少しネックだとも感じました。
下がデータベースを Planet Scale を使って開発しているミューチャです!
友だち登録してトーク画面のメニューからリマインドの設定ができます。よければぜひ使ってみてください。