gpt4 book ai didi

mysql - Rails 迁移似乎已完成,但 rake 仍将迁移显示为挂起

转载 作者:行者123 更新时间:2023-11-28 23:12:29 25 4
gpt4 key购买 nike

我在大型 MySql2 数据库上运行了一个简单的 Rails 迁移,以向表中添加一列:

class AddMiddleNameToPerson < ActiveRecord::Migration[5.0]
def change
add_column :person, :middle_name, :string
end
end

在迁移过程中,我与运行 Rails 应用程序的服务器断开了连接。然后,我重新连接并使用 bundle exec rake db:migrate:status 检查迁移状态,结果显示为关闭:

down    20170424182410  Add middle name to person

我假设它仍在后台运行。所以我离开了一段时间,最终使用 rails 控制台我验证了 person.middle_name 可以在对象上访问。但是,db:migrate:status 仍然显示迁移已停止,如果我尝试再次运行 db:migrate,我会收到错误消息:

Mysql2::Error: Duplicate column name 'middle_name'

所以看起来新列在数据库中,并且可以通过 ActiveRecord 访问,但是 rake db:migrate:status 发现迁移为 down rake db:migrate 尝试重新运行它,但未成功。

最佳答案

如果这是一个生产数据库(或其他包含重要数据的数据库),那么不要 rake db:reset 因为这会删除数据库,您将丢失所有内容;也不要 db:migrate:down 因为那样会删除 middle_name 列,您将失去已有的任何中间名。

首先备份数据库或至少备份您正在使用的表。

其次,使用mysql CLI 工具连接到数据库并说describe people;。您问题中的信息表明您会在那里看到 middle_name 列,但确保您连接到正确的数据库并没有什么坏处。如果 middle_name 不存在,那么您几乎可以肯定在某处连接到错误的数据库,如果存在,那么您只是需要清理迁移问题。

您说数据库连接在迁移完成之前被断开。迁移按以下顺序工作:

  1. 运行迁移以更新数据库。
  2. schema_migrations 表中记录迁移的版本号。
  3. 重新生成 db/schema.rbdb/structure.sql

如果 1 完成但连接丢失,则 2 永远不会发生,因此迁移将运行但 Rails 不会知道。

如果没有其他环境需要迁移,那么您可以简单地删除迁移和 rake db:schema:dumprake db:structure:dump 以获得新的 schema.rbstructure.sql。迁移只是暂时的代码,让你从 A 到 B,所以在它们到处运行后删除它们是好的(甚至推荐),长期重要的是你的数据库结构(在 db/schema.rbdb/structure.sql).

如果其他环境需要运行迁移,那么您可以手动修补 schema_migrations 表;使用 mysql CLI 工具连接到数据库并说 insert into schema_migrations (version) values ('20170424182410');。 Rails 现在会知道迁移已运行,并且将来的 rake db:migrate 调用会很愉快。然后你想刷新你的schema.rb(使用rake db:schema:dump)或structure.sql(使用 rake 数据库:结构:转储)。


您可能有一个 db/schema.rb 文件来跟踪数据库的结构(包括已运行的迁移的版本号)。如果这样做,那么您将使用 rake db:schema:dump 重新生成它。如果您有 db/structure.sql,那么您将使用 rake db:structure:dump

关于mysql - Rails 迁移似乎已完成,但 rake 仍将迁移显示为挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45316843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com