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

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

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

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

4回答

1146閲覧

railsによる開発での、マイグレーションファイル関連のエラーについて

daiishi

総合スコア6

Ruby on Rails 5

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2020/08/21 12:04

前提・実現したいこと

Railsを使ってwebアプリ開発をしているのですが、rails db:migrate実行時のエラーを解決できず困っています。
エラーに至ったのは、マイグレーションファイルでadd_referenceの第二引数で使用するモデル名を間違えて記入してしまいました。subplacesと入力するべきところをsub_placesと入力してしまいました。
その際ターミナル上で出たエラーメッセージが下記1となります。
マイグレート途中でエラーとなったのでrails db:migrate:statusを確認すると当該ファイルの状態はdowmのままでした。当該マイグレーションファイルがdownになっていたのでスペルを書き換えもう一度rails db:migrateを実行したところ、下記2のエラーメッセージが出てしまいます。
おそらく、当該マイグレーションファイルがdownの状態なのにadd_reference :posts, :subplace, foreign_key: true以外の部分がデータベースに反映されてしまっていると思われます。
データベース管理に使用しているSequel Proというソフトではマイグレーションファイルの内容が反映されています。
このような状況での解決策はありますでしょうか?
ご回答よろしくお願いいたします。

発生している問題・エラーメッセージ

エラーメッセージ1 Mysql2::Error: Table 'アプリ名_development.sub_places' doesn't exist: SHOW FULL FIELDS FROM `sub_places` エラーメッセージ2 Mysql2::Error: Duplicate column name 'lunch_name': ALTER TABLE `posts` ADD `lunch_name` varchar(255)

該当のソースコード

ruby

1# マイグレーションファイル 2class AddDetails2ToPosts < ActiveRecord::Migration[5.2] 3 def change 4 add_column :posts, :lunch_name, :string 5 add_column :posts, :lunch_text, :text 6 add_column :posts, :lunch_image, :text 7 add_column :posts, :lunch_address, :string 8 add_column :posts, :lunch_link, :string 9 add_column :posts, :dinner_name, :string 10 add_column :posts, :dinner_text, :text 11 add_column :posts, :dinner_image, :text 12 add_column :posts, :dinner_address, :string 13 add_column :posts, :dinner_link, :string 14 add_column :posts, :section1, :integer 15 add_column :posts, :section2, :integer 16 add_column :posts, :section3, :integer 17 add_column :posts, :section4, :integer 18 19 add_reference :posts, :place, foreign_key: true 20 add_reference :posts, :subplace, foreign_key: true 21 end 22end 23

試したこと

https://qiita.com/niyomong/items/22fa60657ea8ee478647a
こちらの記事を参考にさせていただき。
一度マイグレーションファイルを空にしてrails db:migrateし、statusをupにした状態でrails db:rollbackを行い,スペルを直し再度rails db:migrateを行う。
結果、上記のエラーメッセージ2と同じことになりました。

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

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

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

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

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

guest

回答4

0

SQLを使用し直接不要なカラムを削除して解決しました
・時間がかかった点
外部キー制約がかかっていたため、外部キーが単純には削除できませんでした。
ALTER TABLE posts DROP COLUMN 外部キー;
する前に
SHOW CREATE TABLE posts;
(CONSTRAINTの右側にあるのが外部キー制約名)
で外部キー制約名を確認し
ALTER TABLE posts DROP FOREIGN KEY 外部キー制約名;
を実行することで外部キーの削除に成功しました。
その後schemaファイルを変更前の状態に戻し、rails db:migrateでマイグレーションファイルを反映させることができました。

投稿2020/08/23 05:02

daiishi

総合スコア6

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

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

0

SQLを使用し直接不要なカラムを削除して解決しました
・時間がかかった点
外部キー制約がかかっていたため、外部キーが単純には削除できませんでした。
ALTER TABLE posts DROP COLUMN 外部キー;
する前に
SHOW CREATE TABLE posts;
(CONSTRAINTの右側にあるのが外部キー制約名)
で外部キー制約名を確認し
ALTER TABLE posts DROP FOREIGN KEY 外部キー制約名;
を実行することで外部キーの削除に成功しました。
その後schemaファイルを変更前の状態に戻し、rails db:migrateでマイグレーションファイルを反映させることができました。

投稿2020/08/23 03:52

daiishi

総合スコア6

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

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

0

自己解決

SQLを使用し直接不要なカラムを削除して解決しました
・時間がかかった点
外部キー制約がかかっていたため、外部キーが単純には削除できませんでした。
ALTER TABLE posts DROP COLUMN 外部キー;
する前に
SHOW CREATE TABLE posts;
(CONSTRAINTの右側にあるのが外部キー制約名)
で外部キー制約名を確認し
ALTER TABLE posts DROP FOREIGN KEY 外部キー制約名;
を実行することで外部キーの削除に成功しました。
その後schemaファイルを変更前の状態に戻し、rails db:migrateでマイグレーションファイルを反映させることができました。

投稿2020/08/23 03:50

daiishi

総合スコア6

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

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

0

Mysql2::Error: Duplicate column name 'lunch_name':
と出ていますが?
lunch_nameはすでにカラムとして存在していませんか?

投稿2020/08/21 12:06

nasuk47

総合スコア311

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

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

daiishi

2020/08/21 12:18

マイグレーションファイルでlunch_nameというカラム名を使用しているのは当該ファイルのみです。 rails db:migrate:statusを実行すると up 20200116052507 Create posts up 20200116052828 Create places up 20200116111220 Add image to places up 20200118113702 Devise create users up 20200118120853 Add nickname to users up 20200119075846 Add details to posts up 20200119080633 Add user id to posts up 20200121082518 Add column to users up 20200219114334 Remove tel from places up 20200219114621 Add prefecture to places up 20200219114902 Add description to places up 20200220103437 Create subplaces up 20200223114625 Remove restaurant from posts up 20200821075558 Remove details from posts down 20200821092224 Add details2 to posts となり、当該ファイルは反映されていないはずなのですがlunch_nameというカラムが存在してしまっている状態です。 downの状態なのに当該ファイルが反映されているという矛盾が起きているように思います。
nasuk47

2020/08/21 12:24

一度lunch_nameをのぞいてmigrateするとどうなるのでしょうか?
daiishi

2020/08/21 12:37

Mysql2::Error: Duplicate column name 'lunch_text': ALTER TABLE `posts` ADD `lunch_text` text と出ます。 最初のエラーの際のターミナルで出た処理内容は下記のようになっています。 -- add_column(:posts, :lunch_name, :string) -> 0.0227s -- add_column(:posts, :lunch_text, :text) -> 0.0259s -- add_column(:posts, :lunch_image, :text) -> 0.0333s -- add_column(:posts, :lunch_address, :string) -> 0.0320s -- add_column(:posts, :lunch_link, :string) -> 0.0212s -- add_column(:posts, :dinner_name, :string) -> 0.0218s -- add_column(:posts, :dinner_text, :text) -> 0.0251s -- add_column(:posts, :dinner_image, :text) -> 0.0304s -- add_column(:posts, :dinner_address, :string) -> 0.0338s -- add_column(:posts, :dinner_link, :string) -> 0.0359s -- add_column(:posts, :section1, :integer) -> 0.0234s -- add_column(:posts, :section2, :integer) -> 0.0285s -- add_column(:posts, :section3, :integer) -> 0.0205s -- add_column(:posts, :section4, :integer) -> 0.0285s -- add_reference(:posts, :place, {:foreign_key=>true}) -> 0.0752s -- add_reference(:posts, :sub_place, {:foreign_key=>true}) rails aborted! StandardError: An error has occurred, all later migrations canceled: Mysql2::Error: Table 'decideyourplan_development.sub_places' doesn't exist: SHOW FULL FIELDS FROM `sub_places` errorの時点でstatusがupになっていないのに、lunch_nameなどのカラムが存在してしまっているのが不思議です。
nasuk47

2020/08/21 21:49

ちなみにですが現在はデータベースの中にデータが入っていてそのデータは削除したくないといった状況でしょうか? もしデータを削除してもいいのならmigrateファイルを作り直して`rails db:migrate:reset`でデータを作り直した方がいいかもです。
daiishi

2020/08/23 03:39

できれば消したくなかったので、SQLで直接カラムを削除してみました。 逆に時間がかかってしまったので、nasuk47さんのrails db:migrate:resetした方が早かったと思います。 ご丁寧にご回答くださりありがとうございました。
nasuk47

2020/08/23 04:30

解決できたんですね!素晴らしいです!! 僕も昔はカラムを追加したり消したりのマイグレーションファイルを作成していたのですが開発環境だとどうしても変更が多くなるのでseedのデータを作成しておいて rails db:migrate:reset db:seed_fu のコマンドを打つようにしています。
daiishi

2020/08/23 05:09

開発当初seedファイルの存在を知らずに、無駄にデータベースにデータを入力していました。 product環境でもseedファイルを準備しておいた方が良さそうなので、seedファイルを使ってより効率的に開発を進めていきたいと思います。 アドバイスありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問