LoginSignup
23
24

More than 5 years have passed since last update.

rails db migrateのブラックボックス感、解消しとこう

Last updated at Posted at 2015-05-10

rake db:migrateの仕組み

db上のscheme_migrationsが読み込み済みのmigration fileかどうかを判断している。

- rake db:migrateがされた際に、railsはmigrationファイルを見に行きます。
- migrationファイル内でそのタイムスタンプがまだ、scheme_migrationsに乗ってないやつを、未読み込みのmigration fileであると認定。
- 未読み込みのmigration fileを読み込みdbにテーブルなりコラムなり作成/編集。
- 同時に読み込んだファイルのタイムスタンプをmigration fileに記録(これでもう同じファイルを次から読み込まない。)
なので、dbを綺麗に保ちたければ消したテーブルのscheme_migrations内のrowも消しておきましょう。そうすれば、やらかしたミスは完全に姿形消します。

以上理解して、冷静に弄りましょう。じゃないとグループ開発で怒られます。

rails g migrateでやらかした時は、以下のフローで対応するといいですよ。

あ、やべ、migration fileの名前きもすぎる

へんな名前のmigration file作って、やり直したいという場合

→まだrake db:migrateしてなければ

セーフです。
migration fileを普通に削除しましょう。rm filepathとかでいつも通り。

→rake db:migrateしちゃってる人

アウト。めんどいです。
落ちついて、drop tableのmigrationファイルを作ってtableを消しましょう。

でもグループ開発しててファイル数増やしたくないし...

migrationファイルの存在自体を抹消したければ、それも可能です。すでにdb上には書き込まれているのでdb上のテーブルを消してやる必要が有ります。(dbに残ってると、scheme.rbに残り汚し続けるので。)db上のを消したければ、①直接mysqlで消す、or ②drop tableのmigration file書く。でも②だと、グループ開発の場合他の人が困る。そもそもcreateするmigration fileがないのにdropのみ存在することになるので。なので、①の直接mysqlからそのテーブル消しましょう。drop table tablenameで消したりましょう。これで存在抹消できます。

ちなみに

db/scheme.rbはdb上のテーブルから描かれる。

23
24
0

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
23
24