DB

【Planet Scale × Rails】マイグレーションを行う方法

前回の記事で個人アプリのデータベースを 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;

無料プランではブランチは1つしか作れないので、すでにブランチがある場合は削除するコマンドを実行します。

$ pscale branch delete database_name branch_name

ローカルのデータベース環境を作成したブランチの環境と接続し、マイグレーションを実行する

確認ができたら 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 Desktop for Mac でしか動作しないようです。(上記ドキュメントより)

接続情報の変更ができたらいよいよマイグレーションをして、確認までします。

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 を使って開発しているミューチャです!
友だち登録してトーク画面のメニューからリマインドの設定ができます。よければぜひ使ってみてください。

画像に alt 属性が指定されていません。ファイル名: M_gainfriends_2dbarcodes_GW.png
ABOUT ME
sakai
東京在住の30歳。元々は車部品メーカーで働いていてましたが、プログラミングに興味を持ちスクールに通ってエンジニアになりました。 そこからベンチャー → メガベンチャー → 個人事業主になりました。 最近は生成 AI 関連の業務を中心にやっています。 ヒカルチャンネル(Youtube)とワンピースが大好きです!