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 迁移:self.up 和 self.down 与更改