32
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Rails]migration恐怖症からの脱却

Last updated at Posted at 2019-10-21

#migrationでやらかさないために
上手く動かないから一旦migrationファイルけしちゃお〜とか、
過去のmigrationファイルをいじってロールバックしたりmigrationしたりとごたごたするとか、、

するとコードの辻褄が合わなくなり、マイグレーションエラーの迷路から抜け出せなくなってしまって、戻り方わかんない、、migrationこわっってなったので今後そうならないように整理しようと思います。

ロールバックの注意

rails db:migrateは最新まで一気にmigrateしますが、
rails db:rollbackひとつ前まで戻します。

※ひとつ前とは一個前のmigration分戻すということ。(ファイル数ではない)

ですので、rails db:rollbackした後に、
けっこう前のファイルに変更を加えて、
rails db:migrateってやってしまうとのエラーになってしまうんですね。

具体的には次のような感じです。
ひとつロールバックしたのに3つ前のファイルをいじっちゃってるみたいな状態。

20190828061424 #変更を加えたファイル
20191021065344
----------------- #ココから下はmigration済
20191021065713 

この状態でmigrationしてしまうとアウトです。

エラーになっても焦らず対処

仮に変更を加えてしまったファイルが
20190828061424だとしまして、

まず、今どこまでロールバックできているのかの確認!
$ rails db:abort_if_pending_migrationsこれをしてみましょう。

$ rails db:abort_if_pending_migrations
# => You have 1 pending migration:
  20191021065713 CreateUsersComment

状況はこうなります。

20190828061424 #変更を加えたファイル
20191021065344
----------------- #ココから下はmigration済
20191021065713 

どうやらあと2つ戻る必要があるみたい。
rails db:rollback STEP=2とやる。

一応現状でどこまでmigration済みかを確認すると

$ rails db:abort_if_pending_migrations
# => You have 3 pending migrations:
  20190828061424 CreateComments
  20191021065344 CreateBooksAuthors
  20191021065713 CreateUsersComment

20190828061424のファイルがmigrationしていない状態まで戻れました!
つまりこうなったと。

...
----------------- #ココから下はmigration済
20190828061424 #変更を加えたファイル
20191021065344
20191021065713 

この状態で、rails db:migrateすれば無事変更できる。

もう怖くない。

32
18
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?