5
12

More than 3 years have passed since last update.

[How To]マイグレーションファイルに記載を忘れた!そんなときにマイグレーションファイルを修正するときの方法リスト

Last updated at Posted at 2020-01-11

RailsをベースにWebページを作成にあたり、モデルを作っていたところ、一部記載を失念してしまい、そのままマイグレーションしてしまいました。。。

そこで、マイグレーションファイルを修正する方法を改めて確認したので、備忘録的に以下に記載します!

前提条件

今回の説明にあたり、前提条件としてmigrationフォルダ状況を以下を例とします。

db/migrate
migrate
├─  20200111042708_devise_create_users.rb
├─  20200111045059_add_nickname_to_users.rb
├─  20200111055028_create_addresses.rb

絶対にやっては行けないこと-マイグレーションファイルの削除-

マイグレーションファイルは絶対に削除しないようにしましょう。実行完了後のマイグレーションファイルを削除してしまうと、schema_migrationsと齟齬が生じ問題が生じる恐れがあります。

*schema_migrations:
データベースの変更履歴のようなもので、どのマイグレーションファイルまでが実行されているかが記録されていくテーブル。マイグレーションファイルが実行された際に自動的に作成されます。

rails db:rollback

rails db:rollback:
このコマンドを実行すると、データベースの状態が最新のmigrationファイルを実行する前に戻ります。

rails db:rollbackの手順

1.現状確認
まずはどこまでmigrateが実行されているか確認します。

ターミナル
$ rails db:version
Current version: 20200111055028
#migrateファイルの”20200111055028”までマイグレーションしていることを示してます。
 今回の例をベースにすると一番下(最新)です。
migrate
├─  20200111042708_devise_create_users.rb
├─  20200111045059_add_nickname_to_users.rb
├─  20200111055028_create_addresses.rb

2.rails db:rollback実行

ターミナル
#最新から一つ前まで戻す
$ rails db:rollback

この対応をしているとマイグレーションファイルが大量にあるときに詰みます。。。
そのようなときに、任意のファイルまで戻すやり方は以下となります。

ターミナル
#任意のファイルまで戻す(ステップ数指定)
#数字の部分で指定し、現在地を含めた箇所まで戻します。
#例えばステップ数に2を指定すれば2つ前の状態に戻ります。
$ rails db:rollback STEP=2

#任意のファイルまで戻す(ver指定)
#verを入力してそこまで戻します。
rake db:migrate VERSION=20200111042708

上記がrails db:rollbackによる、マイグレーションファイルの修正となります!

rails db:migrate:reset

rails db:migrate:reset:
このコマンドを実行すると、全てのマイグレーションファイルをリセットして、一から全てマイグレーションします。
*DBのデータが全てリセットされることをご注意ください。

rails db:migrate:resetの手順

rails db:migrate:resetを実行しましょう。以上です。
非常に簡単ですので、開発中でDBに特に重要なデータがない場合は、こちらがおすすめかと思われます。

ターミナル
$rails db:migrate:reset

rails db:reset と rails db:migrate:reset の違い

似たコマンドでrails db:resetというコマンドがありますが、。
結論
db:resetは、db/schema.rbを元にDB作成し、db:seedまで実行される。
db:migrate:resetは、DBを削除した後に、db/migrate/**.rb を古い順から実行するが、db:seedは実行されない。

    
コマンド db:reset db:migrate:reset
db:drop ✔️ ✔️
db:create ✔️ ✔️
db:migrate ✔️
db:schema:load ✔️
db:seed ✔️

*db:seed:
DBに設置する初期データを投入するためのコマンドです。
db/seeds.rbファイルに記入します。

*schema_migrations:
データベースの変更履歴のようなもので、どのマイグレーションファイルまでが実行されているかが記録されていくテーブル。マイグレーションファイルが実行された際に自動的に作成されます。

メモ(マイグレーションファイルに記載する型の種類)

    
説明 用例
integer 数字 ユーザーのidなど
string 文字(少なめ) ユーザー名、パスワードなど
text 文字(多め) 投稿文など
boolean 真か偽か 真偽フラグ
datetime 日付と時刻 作成日時、更新日時など

以上となります。最後までご覧いただき、ありがとうございました!
今後も学習した事項に関してQiitaに投稿していきますので、よろしくお願いします!
記述に何か誤りなどございましたら、お手数ですが、ご連絡いただけますと幸いです。

参照

マイグレーションのロールバック
https://www.javadrive.jp/rails/model/index8.html

rails db:migrate:resetできなかったのでrails db:resetした
https://qiita.com/mom0tomo/items/a252ff8a42eea00f81b1

【Rails】db:reset と db:migrate:reset の違い
https://blog.naichilab.com/entry/db_reset-vs-db_migrate_reset

rake db:seedを使った初期データの投入
https://www.javadrive.jp/rails/model/index10.html

5
12
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
5
12