質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

3回答

3480閲覧

不要なmigrationファイルを削除できない

Salix_Hiroki

総合スコア2

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/05/10 13:23

編集2020/05/10 13:27

お世話になります。

#実現したいこと
不要なmigrationファイルを削除したい。

#状況
rails db:migrate:down VERSION=VERSION名でstatusを「down」に
したいのですがエラーが出てしまいます。

terminal

1ec2-user:~/environment/workspace/portfolio/mychazuke (master) $ bundle exec rake db:migrate:down VERSION=20200209154505 2== 20200209154505 RemovePasswordFromUsers: reverting ========================== 3-- add_column(:users, :password, :string) 4rake aborted! 5StandardError: An error has occurred, all later migrations canceled: 6 7Mysql2::Error: Duplicate column name 'password': ALTER TABLE `users` ADD `password` varchar(255) 8/home/ec2-user/.rvm/gems/ruby-2.6.3/gems/mysql2-0.5.3/lib/mysql2/client.rb:131:in `_query' 9/home/ec2-user/.rvm/gems/ruby-2.6.3/gems/mysql2-0.5.3/lib/mysql2/client.rb:131:in `block in query 10/home/ec2-user/.rvm/gems/ruby-2.6.3/gems/mysql2-0.5.3/lib/mysql2/client.rb:130:in `handle_interrupt' 11/home/ec2-user/.rvm/gems/ruby-2.6.3/gems/mysql2-0.5.3/lib/mysql2/client.rb:130:in `query' 12/home/ec2-user/.rvm/gems/ruby-2.6.3/gems/activerecord-5.2.4.2/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:187:in `block (2 levels) in execute'

#####削除したいmigrationファイル名
20200209154505_remove_password_from_users.rb
20200510094558_remove_password_digest_column.rb
20200510095047_addcolumn_passworddigest.rb

イメージ説明

上記のmigrationファイルはusersテーブルに関するものです。

#####usersテーブルの内容
name string
email string
password string
password_digest string
user_image string

先ほど、herokuにアップし、heroku run rails db:migrateをしたところ
「password_digest」の名前がおかしいと出ていたので、usersテーブルを削除し、
作り直しました。
作成したmigrationファイルは20200510115429_create_usersになります。
しかし、古いusersテーブルのmigrationファイルが残ってしまっている(上記のmigrationファイル)ので
削除できす、どうしたら良いか困惑している状態です。

いろいろ調べましたが、rails db:resetをするべきなのかどうかわからない状態です。

アドバイス等頂けますと幸いです。
ご回答の、よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

rails db:migrate:down VERSION=VERSION名でstatusを「down」に

したいのですが

そもそも、この発想が間違っています。

すでにサーバ反映したマイグレーションや、その後に他のマイグレーションが行われたマイグレーションの場合、仮に間違っていてもそこを修正・削除するのではなく、修正する形となる新たなマイグレーションを作成して対応するのが適切です。

投稿2020/05/10 22:26

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/05/10 22:30

> しかし、古いusersテーブルのmigrationファイルが残ってしまっている(上記のmigrationファイル)ので削除できす drop_tableを行うマイグレーションを別途作れば、過去のマイグレーションとは関係なく削除できるかと思います。
maisumakun

2020/05/10 22:34

なお、同じクラス名のマイグレーションは複数作れません。「20200510115429_create_users」も、過去のCreateUserと衝突しているのではないかと思いますので、「CreeateUser2」でもなんでもいいので別名でやってみてください。
Salix_Hiroki

2020/05/11 13:28 編集

ご回答頂きありがとうございます。おっしゃる通り、migrationファイルの扱い方を間違っておりました。 ご指摘頂き、ありがとうございます。 Usersテーブルをdropすれば過去のmigrationファイルも削除できるということでしょうか。 実際dropした後にrails db:migrate:down VERSION=VERSION名でやってみたのですが、 20200511130627_rails.rbのファイルが作成されました。 statusをみてもupのままで下にstatusが追加されました。 down 20200511130627 Rails ▷すみません、コマンドを間違っておりました
Salix_Hiroki

2020/05/11 13:50

Usersテーブルをdropして新たにUsers2テーブルを作成して bundle exec rake db:migrate VERSION=20200209154505としてみましたが、以下のようなエラーが出てしまいます。 == 20200209154505 RemovePasswordFromUsers: reverting ========================== -- add_column(:users, :password, :string) rake aborted! StandardError: An error has occurred, all later migrations canceled: Mysql2::Error: Table 'mychazuke_development.users' doesn't exist: ALTER TABLE `users` ADD `password` varchar(255) Usersテーブルは存在しないから削除できないということでしょうか。 Users2テーブルに変わっているので削除できるわけではないのでしょうか。 お手数ですが、ご返信のほど、よろしくお願い致します。
guest

0

rails db:migrate:resetにより既存のmigrationでデータベース、テーブルを作成しました。
当然、辻褄が合わないのでエラーが出ます。
rails db:migrate:statusを見るとエラーが出たところから下は全てdownになっているので、
不要なmigrationファイルを削除しました。
その後にrails db:migrateにより解決しました。
いろいろとアドバイスを頂きありがとうございました。
migrationファイルの扱いには慎重にします。

投稿2020/05/14 11:27

編集2020/05/14 11:30
Salix_Hiroki

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

bundle exec rake db:migrate VERSION=20200209154505
ではどうでしょう。

そこまでの必要なmigrationも戻されますから、それに関わるデータは消えたりしますので注意

追記
User関連が混乱してますね
20200209154505 Remove password from users
ということはこれ以前にusersをcreateしているはず。
なのにそのmigrationがない。?????

up 20200510094558 Remove password digest column
up 20200510095047 Addcolumn passworddigest
これらはその usersにたいして行われてません?
なのにまたusersを作っている
up 20200510115429 Create users

で、これはなに? 
up 20200511130020 Users
戻すときに
20200511130020はusersテーブルを削除しました。
となってるってことはここでもcreateしている模様。
しかもupということは成功している。

???????????????? です

こういう事態に陥るようでしたら、migrationを削除する、という作業はやらないことをお薦めします。
railsがdatabase管理をどう行っているのか、が理解できない状態ではやると破綻する。

ですが、この状態でmisumakunさんのいわれる王道:打ち消すmigrationをしても既にusersがおかしくなっているかもしれないからうまく行くものかどうか。
今後の方針案二つ

案1 なぜmigrationを消す必要が出てきたのか、その理由を振り返り、現状を確認し、問題を解きほぐしていく
案2 中止してやり直し。db:dropしてまっさらにし、migration をあるべきものになおし、create、migrate し直す

投稿2020/05/10 18:15

編集2020/05/12 15:37
winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Salix_Hiroki

2020/05/11 14:10

ご返信頂きありがとうございます。 それに関わるデータは消えたりします ▷モデルも削除されるということでしょうか。 勉強不足で申し訳ありません。 ご返信のほど、よろしくお願い致します。
winterboum

2020/05/11 20:41 編集

私の回答は質問に直球で答えてしまいましたが、正しくはmaisumakunさんの方法です。 ただ、 開発途中であ〜〜〜やりなおし!!としたい時もあるかと思うので、続けます。 モデルは削除されません。databaseがそのVERSIONに戻るということなので、createされていたtableはなくなり、追加したcolumnはなくなり、 当然、そのデータは無くなる ということです。 なお、書き忘れましたが bundle exec rake db:migrate VERSION=20200209154505 では 20200209154505 にもどるので、このmigrationは削除できません。 あ、いや、削除すると厄介なことになります。 これを削除するにはその一つ前にまで戻ってください
Salix_Hiroki

2020/05/12 12:10

bundle exec rake db:migrate VERSION=20200118075552を試したのですが、以下のエラーが 出てしまいました。 20200511130020はusersテーブルを削除しました。 == 20200511130020 Users: reverting ============================================ rake aborted! StandardError: An error has occurred, all later migrations canceled: To avoid mistakes, drop_table is only reversible if given options or a block (can be empty). 何かオプションを指定しないといけないのでしょうか。 よろしくお願い致します。
winterboum

2020/05/12 15:11

users の削除に失敗ということは可能性が二つ 1) 既にない 2) foreign_key に指定されているレコードがあり、削除できない 1かどうかどうみるか、ですがとりあえず rails db:migration:status の結果を見せてください。 2の場合は諦めて、maisumakunさんのご指摘の様にしましょう
Salix_Hiroki

2020/05/12 15:19 編集

ご返信頂きありがとうございます。 以下、rails db:migrate:statusの結果になります。 Status Migration ID Migration Name -------------------------------------------------- up 20200118075552 Create recipes up 20200209154505 Remove password from users up 20200211144229 Change datatype material name and material quantity and recipe of recipes up 20200215134455 Create materials up 20200215140839 Remove material from recipes up 20200216125520 Create cookmethods up 20200229154613 Create favorites up 20200301032417 Create comments up 20200504035707 Add column cookmethods up 20200510094558 Remove password digest column up 20200510095047 Addcolumn passworddigest up 20200510115429 Create users up 20200511130020 Users しかし、schema.rbにはusersテーブルの内容が残っています。 よろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問