もくじ
カラム名とか間違えるよね
DBに新しいカラムを追加するためにマイグレーションファイルを作り、意気揚々とrails db:migrate
した後にカラム名のタイポに気付いたり、データ型を間違えていたりとか、絶対やっちゃうと思うんですよ(確信)
それがまだプルリクエストを作っている段階で、自分の手元でしか反映されていないのであれば、割とサクッと修正できるよという話。
具体的な手順
- 反映済みのマイグレーションファイルを
rails db:rollback
でいったん取り消して、DBを過去の状態に戻す - マイグレーションファイルを修正する
- 再度
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つ分戻りたければ、n
を3
に置き換えて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のカラムに齟齬が出たら他のメンバーに迷惑がかかる可能性が高いので。このあたりの運用はチームによってルールが異なると思いますのでその点はご注意いただければと思います。