【问题标题】:Rails migration blocked by "foreign key constraint failed"Rails 迁移被“外键约束失败”阻止
【发布时间】:2019-03-09 05:47:50
【问题描述】:

当我尝试运行一个相对简单的 rails 迁移来移除一列时:

class Removetopicsfromquestions < ActiveRecord::Migration[5.2]
  def change
    change_table :questions do |t|
      t.remove :topic_id
    end
  end
end

由于“外键约束”而失败:

rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

SQLite3::ConstraintException: foreign key constraint failed: DROP TABLE "questions"
/usr/local/rvm/gems/ruby-2.4.1/gems/sqlite3-1.3.13/lib/sqlite3/statement.rb:108:in `step'
/usr/local/rvm/gems/ruby-2.4.1/gems/sqlite3-1.3.13/lib/sqlite3/statement.rb:108:in `block in each'
/usr/local/rvm/gems/ruby-2.4.1/gems/sqlite3-1.3.13/lib/sqlite3/statement.rb:107:in `loop'
/usr/local/rvm/gems/ruby-2.4.1/gems/sqlite3-1.3.13/lib/sqlite3/statement.rb:107:in `each'
/usr/local/rvm/gems/ruby-2.4.1/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:152:in `map'
/usr/local/rvm/gems/ruby-2.4.1/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:152:in `block in execute'
/usr/local/rvm/gems/ruby-2.4.1/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:95:in `prepare'
/usr/local/rvm/gems/ruby-2.4.1/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:137:in `execute'
etc...

作为参考,这是表格当前的样子:

create_table "questions", force: :cascade do |t|
    t.integer "topic_id"
    t.string "name"
    t.text "explanation"
    t.boolean "published", default: true
    t.string "usage", default: "Free Quiz", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "variant", default: "fill", null: false
    t.string "correct"
    t.string "alt_one"
    t.string "alt_two"
    t.string "alt_three"
    t.string "editor"
    t.boolean "accepted"
    t.string "reference"
    t.text "context"
    t.string "questionable_type"
    t.integer "questionable_id"
    t.index ["questionable_type", "questionable_id"], name: "index_questions_on_questionable_type_and_questionable_id"
  end

知道我做错了什么吗?

【问题讨论】:

  • 在您的任何模型中是否将 :topic、:topics 或 :topic_id 作为关联引用?

标签: ruby-on-rails


【解决方案1】:

我假设您的架构底部有类似的东西?

add_foreign_key "questions", "topics"

Rails 无法从表中删除此列,因为添加了外键。在你的迁移文件中试试这个:

def change
  remove_reference :questions, :topic, index: true, foreign_key: true
end

【讨论】:

  • 感谢您的想法 - 我的整个 schema.rb 文件中似乎没有任何外键。
猜你喜欢
  • 2020-10-30
  • 1970-01-01
  • 2016-01-20
  • 1970-01-01
  • 2017-04-21
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 2021-12-09
相关资源
最近更新 更多