0

迁移我跑了一大MySql2分贝简单的轨道迁移到列添加到表:Rails的迁移似乎完成,但耙仍显示为待定

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

我是从运行轨道与服务器断开连接应用程序在迁移期间。然后我重新连接并检查迁移状态与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认定迁移为downrake db:migrate尝试重新运行它,失败。

回答

1

如果这是一个生产数据库(或其他数据库的重要数据),那么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

如果完成,但连接丢失,然后从未发生过这样的迁移将已经运行,但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:structure:dump)。


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

+0

最终完成类似于此的操作来解决问题。接受。 – wildabeast

相关问题