【问题标题】:How to fix 'ActiveRecord::InvalidForeignKey: SQLite3::ConstraintException: FOREIGN KEY constraint failed' when changing column name更改列名时如何修复“ActiveRecord::InvalidForeignKey: SQLite3::ConstraintException: FOREIGN KEY constraint failed”
【发布时间】:2019-12-04 22:47:07
【问题描述】:

我正在开发一个 Rails 网络应用程序。我有一个名为countries 的表,它与另外两个表相关联:citiessites。当我尝试将countries 表中的code 列更改为name 时,出现以下异常:

ActiveRecord::InvalidForeignKey: SQLite3::ConstraintException: FOREIGN KEY 约束失败:DROP TABLE "countries"

我已经尝试添加 dependent: :destroy 东西,但我仍然遇到同样的异常。我尝试删除表并重新创建它,但仍然无法正常工作。任何帮助将不胜感激。

Country模特:

class Country < ApplicationRecord

    has_many :cities, dependent: :destroy
    has_many :sites, dependent: :destroy

    has_many_attached :photos

    validates :code, uniqueness: true
    validates :about, presence: true

end

这是我用来更改countries 表中列名称的迁移代码:

class FixCodeName < ActiveRecord::Migration[5.2]
def change
    rename_column :countries, :code, :name
  end
end

【问题讨论】:

    标签: ruby-on-rails database sqlite activerecord ruby-on-rails-5


    【解决方案1】:

    您是如何尝试重命名该列的?像下面这样的迁移?

    class ChangeColumnName < ActiveRecord::Migration[5.2]
      def change
        rename_column :countries, :code, :name
      end
    end
    

    如果您删除了整个数据库,您可以编辑旧迁移,然后重新创建它。如果在开发过程的早期,我通常会这样做。

    【讨论】:

    • 是的,通过迁移。我正处于我的应用程序开发的早期阶段,但我厌倦了每次出现问题或想要进行小改动时都删除我的 who 数据库。
    • 我不明白您的代码为什么要尝试 DROP TABLE "countries" 来重命名列。你能解释一下吗?
    • 我的代码没有尝试 DROP TABLE “国家”,我不确定为什么异常文本中提到了这种所谓的行为。
    • 您可以编辑您的帖子并将您的迁移代码添加到其中吗?也许这会给我们一个线索。
    • 我相信您会收到此错误,因为列代码上有索引。您可以删除索引然后尝试运行迁移吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 2020-08-07
    • 2022-08-22
    • 2019-11-14
    • 2018-10-11
    • 2022-11-29
    • 1970-01-01
    相关资源
    最近更新 更多