どなブロ

Ruby, Rails, Python, 機械学習, その他気になったこととか思ったこととか

【Rails】migrationでのDB更新を余計な変更を加えずにschema.rbに反映させる

migrationで何かしらの変更をDBに加える時、db:migrateするとschema.rbへ更新が反映されます。
その時にDBが何かしらの理由で実際の形と異なっているとschema.rbに余計な変更が反映されてしまいます。

自分の場合で言うと、
流れとしてはローカルに立ててあるDBに向けてmigrateをして、schema.rbに変更が加わった後にmigrationファイルと一緒にコミットする感じです。
(これが普通のやり方なのかな?わからん)
それで、ローカルのDBに他の作業とかで関係ない変更が入ってたりすると、目的のmigrationと別の変更がschema.rbに入っちゃうっちゅうわけです。

今回はそういう時に安全に目的の変更だけをschemaに反映させる方法のメモです。
DBに消しちゃいけないデータがある場合はできないと思います。
あくまで自分みたいにmigration用みたいなDBがある場合。

変更前として正しいschema.rbをpullなどしてくる

db:migrateする前であればそのままでいいんですが、migrationで変更を入れる前の段階として正しいschema.rbをmasterブランチとかから持ってきます。
このschemaファイルは目的のmigrationの直前の状態のはずです。

db:resetしてDBをschema.rbと同じ状態にする

db:resetをするとDBがschema.rbと同じ状態になります。
類似のものにdb:migrate:resetがありますが、2つの違いについては簡単に言えば

db:reset => schema.rbを参照してDBを作り直す
db:migrate:reset => DBをDROPしてイチからmigrationし直す

って感じです。
詳しくはこちらで→rails db:migrate:resetできなかったのでrails db:resetした - Qiita

目的のmigrationファイルでdb:migrateする

あとはmigrationするだけです。
やってみたらgit diffとかで差分を見れば目的の変更だけdiffがある…はず。

おわり

勢いで書いたのでクソ読みづらいですね。すみませぬ。