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

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

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

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

Q&A

解決済

1回答

7019閲覧

テーブルのカラムが削除できない

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails 5

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

0グッド

1クリップ

投稿2018/08/19 03:23

Ruby on Rails でproblemsというテーブルからplaceというカラムを削除しようとし、マイグレーションファイルを実行したところ、以下のエラーが発生してしまいました。

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

C:\Users\XXXX>rails db:migrate == 20180819025741 RemovePlaceToProblem: migrating ============================= -- remove_column(:problems, :place, :string) rails aborted! StandardError: An error has occurred, this and all later migrations canceled: SQLite3::ConstraintException: FOREIGN KEY constraint failed: DROP TABLE "problems" C:/Users/XXXX/db/migrate/20180819025741_remove_place_to_problem.rb:3:in `change' bin/rails:4:in `require' bin/rails:4:in `<main>' Caused by: ActiveRecord::InvalidForeignKey: SQLite3::ConstraintException: FOREIGN KEY constraint failed: DROP TABLE "problems" C:/Users/XXXX/db/migrate/20180819025741_remove_place_to_problem.rb:3:in `change' bin/rails:4:in `require' bin/rails:4:in `<main>' Caused by: SQLite3::ConstraintException: FOREIGN KEY constraint failed C:/Users/XXXX/db/migrate/20180819025741_remove_place_to_problem.rb:3:in `change' bin/rails:4:in `require' bin/rails:4:in `<main>' Tasks: TOP => db:migrate (See full trace by running task with --trace)

該当のソースコード

(↓) db\migrate\20180819025741_remove_place_to_problem.rb

class RemovePlaceToProblem < ActiveRecord::Migration[5.1] def change remove_column :problems, :place, :string end end

(↓)db\schema.rb

create_table "problems", force: :cascade do |t| t.string "name" t.string "grade" t.string "place" t.datetime "created_at", null: false t.datetime "updated_at", null: false end create_table "posts", force: :cascade do |t| t.text "URL" t.text "comment" t.integer "problem_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.boolean "approved" t.index ["problem_id"], name: "index_posts_on_problem_id" end

(↓)app\models\problem.rb

class Problem < ApplicationRecord has_many :posts, dependent: :destroy validates :name, presence: true, uniqueness: true validates :grade, presence: true end

(↓)app\models\post.rb

class Post < ApplicationRecord belongs_to :problem, dependent :destroy validates :URL, presence: true, uniqueness: true validates :comment, length: { maximum: 500 } end

エラーメッセージを読むと、外部キー制約に関連してエラーが発生しているようだということは分かったのですが、どのようにすればエラーを起こさず削除できるのかが分かりません。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

SQLiteには、カラムをリネームする操作、削除する操作は実装されていません。
なので、Railsはテーブルごと作り直そうとします。

が、外部キー制約により、problemsを削除できなかったのでしょう。

今あるデータがすべて消えてしまっても良いならば、bin/rake db:migrate:reset
でデータが空の状態にしてからmigrateしなおすので、外部キー制約にかからずにカラムを削除(実際にはテーブルの作り直しですが)ができます。

もし、データを保存したいのであれば、SQLiteにはテーブルをリネームする操作はあるようなので、
手動で

削除したいカラムのない新しいテーブルproblems2を作る
problemsからproblems2へデータをコピーする
problemsをproblems_oldへリネームする
problems2をproblemsへリネームする
problems2を落とす

みたいなことで可能かもしれません。
(ただし、途中でFKを外して、付け直す、のような操作が必要な可能性はあり。微妙ですね)

投稿2018/08/30 15:27

編集2018/08/30 15:30
takumiabe

総合スコア661

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

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

退会済みユーザー

退会済みユーザー

2018/09/02 04:40

SQLiteにはカラムを削除する操作は実装されていないのですね...! 1つめのご提案のとおりいったんリセットして、想定どおりのテーブルを再作成することができました。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問