代码之家  ›  专栏  ›  技术社区  ›  wildabeast

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

  •  1
  • wildabeast  · 技术社区  · 7 年前

    我在大型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控制台验证了那个人。在对象上可以访问middle_名称。然而 db:migrate:status db:migrate 再次出现错误:

    Mysql2::Error: Duplicate column name 'middle_name'
    

    rake db:migrate:status 将迁移查找为 down rake db:migrate

    1 回复  |  直到 7 年前
        1
  •  1
  •   mu is too short    7 年前

    rake db:reset 因为那样会删除数据库,你会失去一切;而且 不要 db:migrate:down middle_name 列,您将丢失已有的中间名。

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

    其次,使用 mysql describe people; .您问题中的信息表明您将看到 中间_名称 中间_名称

    您说数据库连接在迁移完成之前已断开。迁移按以下顺序进行:

    1. 将迁移的版本号记录在 schema_migrations
    2. 使振兴 db/schema.rb db/structure.sql .

    完成,但连接丢失 永远不会发生这样的情况,迁移将运行,但Rails不会知道。

    如果没有其他环境需要迁移,则只需删除迁移并 rake db:schema:dump rake db:structure:dump schema.rb structure.sql 数据库/模式.rb ).

    如果其他环境需要运行迁移,则可以手动修补 mysql CLI工具和say insert into schema_migrations (version) values ('20170424182410'); rake db:migrate 打电话会很愉快。然后你想刷新你的 (带 )或 (带 ).


    你可能有一个 数据库/模式.rb 用于跟踪数据库结构的文件(包括已运行的迁移的版本号)。如果你这样做,那么你会使用 rake数据库:模式:转储 使其再生。如果你有 数据库/结构.sql 然后你会使用