当前位置: 首页 > 知识库问答 >
问题:

Rails迁移-暂时忽略外键约束?

郑帅
2023-03-14
class AddUuidToProjects < ActiveRecord::Migration[5.0]
  def up
    add_column :projects, :uuid, :string, limit:36, null: false, first: true
    add_column :projects, :old_id, :integer

    Project.all.each do |p|
      p.update!(old_id: p.id)
    end
    change_table :projects do |t|
      t.remove :id
      t.rename :uuid, :id
    end
    execute "ALTER TABLE projects ADD PRIMARY KEY (id);"

    Project.all.each do |p|
      # has_one image
      Image.find(p.old_id).update!(project: p) 
      # has_many stories
      Story.where(project_id: p.old_id).each do |s|
        s.update!(project: p)
      end
    end
  end
  ...
end
Mysql2::Error: Cannot drop column 'id': needed in a foreign key constraint 'fk_rails_be41fd4bb7' of table 'db_dev.stories': ALTER TABLE `projects` DROP `id`

问题是,如果整个迁移运行,那么我将用另一列替换id列,并修复外键。那么,有什么方法可以忽略迁移的约束呢?

共有1个答案

魏航
2023-03-14

ActiveRecord::base.connection.disable_referential_integrity(Github)。至少需要Rails4.2。

附言。

我发现上面的代码很容易出错。对我来说,主要原因是缺乏对如此重要任务的测试。“ThoughtBot”中有一篇关于将数据迁移与结构迁移混合的其他问题的文章。

 类似资料:
  • 我有一个应用程序,上面有帖子、用户、标签等等。我一直在本地进行这项工作,但由于一个问题,无法将其推给heroku。最后,我成功地将我的应用程序推到了heroku,然后意识到我从未在那里迁移过我的数据库。所以我跑了 并得到这个错误: 我查了一下迁移,出于某种原因,它在其他任何事情之前都有删除表行: 我注释掉了drop table行,甚至删除了它,然后使用git commit提交,然后尝试运行hero

  • 我正在尝试在Laravel中创建外键,但是当我使用迁移表时,出现以下错误: 我的迁移代码如下: 优先级迁移文件 用户迁移文件 任何关于我做错了什么的想法,我现在就想知道,因为我有很多表需要创建,例如用户、客户、项目、任务、状态、优先级、类型、团队。理想情况下,我希望创建使用外键保存此数据的表,即和等。 希望有人能帮助我开始。

  • 我试图在Laravel中创建外键,但是当我使用artisan迁移我的表时,我被抛出以下错误: 模块迁移表: 课程迁移表: 任何关于我做错了什么的想法,我想现在就得到这个,因为我需要创建很多表,例如用户、客户端、项目、任务、状态、优先级、类型、团队。理想情况下,我想创建包含外键、i... eclients_project和project_tasks等数据的表。 希望有人能帮助我开始。

  • 我有多个迁移,但我认为与这个问题相关的两个迁移是“作业”和“会话”迁移。 作业迁移

  • 我已经发现了几十个类似的问题,但没有一个解决方案在我的案例中有效。当我运行“php artisan migrate:fresh”时,它抛出了错误。。。 illumb\Database\QueryException:SQLSTATE[HY000]:一般错误:1215无法添加外键约束(SQL:alter tableadd constraint外键()引用()关于删除级联) > 我检查auth用户表,它

  • 问题内容: 是否可以暂时禁用MySQL中的约束? 我有两个Django模型,每个模型都有一个到另一个的ForeignKey。由于ForeignKey约束,删除模型实例将返回错误: 是否可以暂时禁用约束并仍然删除? 问题答案: 尝试或 确保