ham-capのブログ

プログラミング学習の記録

【Rails・DB】DB反映済みのマイグレーションファイルを手元でサクッと修正する手順

もくじ

カラム名とか間違えるよね

DBに新しいカラムを追加するためにマイグレーションファイルを作り、意気揚々とrails db:migrateした後にカラム名のタイポに気付いたり、データ型を間違えていたりとか、絶対やっちゃうと思うんですよ(確信) それがまだプルリクエストを作っている段階で、自分の手元でしか反映されていないのであれば、割とサクッと修正できるよという話。

具体的な手順

  1. 反映済みのマイグレーションファイルをrails db:rollbackでいったん取り消して、DBを過去の状態に戻す
  2. マイグレーションファイルを修正する
  3. 再度rails db:migrateでDBに反映させる

こんだけ。

事前準備

実際にrails db:rollbackを実行する前に、どのマイグレーションファイルを修正するのかを確認したいので、rails db:migrate:statusでDBの状態を確認します。 するとこんな感じでマイグレーションの一覧が表示されます。

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     xxxxxxxxxxxxxxx  Create xxxxxxx
   up     xxxxxxxxxxxxxxx  Add xxxxx to xxxxx

左端のstatusがupになっている場合、DBに反映済みですよということです。 問題は、このままでは修正も削除もできないということ。 なので、次のrails db:rollbackでDBを過去の状態に戻します。 そうすることで、マイグレーションファイルも未反映の状態(rails db:migrateされていない状態)に戻ります。 例えば、DBを2つ前の状態に戻すということは全てのマイグレーションファイルのうち直近2つが未反映の状態に戻るということになります。

修正する

rails db:rollbackを実行すると、直近のマイグレーションファイル1つが未反映の状態になります。 先ほどと同様にrails db:migrate:statusで確認してみると、statusが1つだけdownになっていると思います。

この状態でファイルの内容を修正します。 修正が終わったら、あとは再度rails db:migrateマイグレーションファイルを反映させれば終了です。

rails db:rollbackの仕様

上にも書きましたが、rails db:rollbackをそのまま実行すると直近のマイグレーションファイル1つだけが未反映の状態になります。 つまり、何も指定せずに実行すると一段階ずつ過去に遡っていくことになります。 しかし、2つ以上前の時点まで一気に戻りたいこともあると思います。 そんな時はdb:rollback STEP=nで任意の時点まで一気にさかのぼることが可能です。 例えば、マイグレーションファイル3つ分戻りたければ、n3に置き換えてdb:rollback STEP=3として実行すればOKです。

また、特定のマイグレーションファイルのみ状態を変更したい場合、db:migrate:up VERSION=xxxxxxxまたはdb:migrate:down VERSION=xxxxxxxで操作できます。xxxxxxxの部分にはrails db:migrate:statusで確認したときのMigration IDを指定します。

まとめ

以上がrails db:rollbackを使ってマイグレーションファイルを修正する手順です。 ただし、これはあくまで自分一人で開発している場合や、開発用にブランチを切ってmergeされていない状態である場合に有効な手段だと思っておいたほうがよさそうです。チームで開発していてDBのカラムに齟齬が出たら他のメンバーに迷惑がかかる可能性が高いので。このあたりの運用はチームによってルールが異なると思いますのでその点はご注意いただければと思います。