rails 迁移更改了不相关的列

Posted

技术标签:

【中文标题】rails 迁移更改了不相关的列【英文标题】:rails migrations changed unrelated columns 【发布时间】:2019-09-26 03:13:27 【问题描述】:

我运行的迁移没有以任何方式触及给定的表。运行它后,引用该表的 3 个外键被删除,它们对应的列从 bigints 更改为 integers。

这导致了

我有一个应用程序在生产中运行,列 A、B、C 作为带有外键的 bigint, 我有将它们设置为 bigint 和外键的迁移, 我没有移除那些外键和 的迁移 我没有将它们从 bigint 恢复为整数的迁移,并且 我的 schema.rb 在我的提交中将它们定义为整数(在我意识到错误之前提交)

一个例子:

# the most recent migration related to the column
# but an old one (not only executed on dev branch)
def up
  # ...
  change_column :abc, :table_a_id, :bigint
  # ...
# development db/schema.rb
# ...
create_table "abc", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
  t.integer "table_a_id"
# ...
# production db/schema.rb
# ...
create_table "abc", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
  t.bigint "table_a_id"
# ...
add_foreign_key "abc", "table_a"
# ...

我运行了rails db:reset,没有任何变化。

AFAIK,我无法创建迁移来纠正这些更改,因为这样的迁移会在生产中失败。它是否正确?如果是这样,我该怎么做才能挽救提交并防止再次发生这种情况?我可以手动还原我的 schema.rb 吗?为什么/如何发生这种情况?

【问题讨论】:

【参考方案1】:

关于回滚迁移的有用信息:

How to rollback a specific migration?

长话短说,是的,您可以重置数据库和 schema.rb 文件的结构。您可能会丢失已删除列中的任何数据,但是如果您的目的是让您的 schema.rb 文件看起来正确,以便它通过任何预部署挂钩,那么回滚并重置您的 schema.rb 文件是要走的路:

rake db:rollback

将还原您最近的迁移。如果此迁移不是您的问题,请尝试:

rake db:migrate:down VERSION=20100905201547

使用迁移文件名中存在的正确版本时间戳。完成此操作后,您将修复本地数据库,但您的架构文件仍将不同步。修复此运行

rake db:schema:dump

最后,如果你仍然头疼,作为最后的选择,你可以

git checkout db/schema.rb

您将获得最新版本的 db/schema.rb,该版本已推送到您正在处理的分支。或者:

git checkout origin/master db/schema.rb

将您的 schema.rb 文件重置为 master。只要您不推动任何损坏的迁移,并且您的 schema.rb 文件是有序的,那么您就不会为其他任何人破坏任何东西

【讨论】:

虽然我不确定这是否回答了“为什么/如何发生这种情况?”的问题,但用 master 的结帐替换架构效果很好。谢谢!

以上是关于rails 迁移更改了不相关的列的主要内容,如果未能解决你的问题,请参考以下文章

Rails 迁移不会更改 schema.rb

更改列的 Rails 迁移

Rails 迁移:self.up 和 self.down 与更改

Rails 迁移总是在模式中插入空格或更改列的顺序

在 Laravel 迁移中更改列会导致异常:更改表的列需要 Doctrine DBAL

在 Rails 5 中添加引用列迁移