MySQL Schema_迁移-活动记录-更新值

MySQL Schema_迁移-活动记录-更新值,mysql,ruby-on-rails,database,activerecord,Mysql,Ruby On Rails,Database,Activerecord,我们遗留的Rails应用程序有一些不完整的迁移(所以我们将我们的迁移)集成到一个大型迁移中,为它编写了一个rake任务,所有这些都非常有效 desc "Removes all schema migrations and inserts the migration reconstruction" task reconstruct_migrations: :environment do reconstruction_migration = Dir["db/migrate/*.rb"].fin

我们遗留的Rails应用程序有一些不完整的迁移(所以我们将我们的迁移)集成到一个大型迁移中,为它编写了一个rake任务,所有这些都非常有效

desc "Removes all schema migrations and inserts the migration reconstruction"
 task reconstruct_migrations: :environment do
   reconstruction_migration = Dir["db/migrate/*.rb"].find { |migration| migration =~ /reconstruct_database/ }
   file_name = reconstruction_migration.split("/").last
   timestamp = file_name.split("_").first

   puts ">> Resetting migration version to #{timestamp}"

   ActiveRecord::Base.transaction do
     ActiveRecord::Base.connection.tap do |c|
       c.execute("DELETE FROM schema_migrations")
       c.execute("INSERT INTO schema_migrations(version) VALUES ('#{timestamp}')")
     end
  end
end
这是一个有点非正统,但它是一个大型的遗留应用程序,这是一种情况。但是,即使在重建我的迁移之后,当运行新的迁移时,它也会失败,因为现有的MySQL转储将有一个冲突的schema_migrations表。其版本列包含所有以前的迁移时间戳,如下所示:

+----------------+
| version        |
+----------------+
| 20081121002510 |
| 20081124055648 |
| 20081124102955 |
| 20081124103008 |
etc....
要解决我的问题,我需要用rails应用程序中的当前时间戳覆盖此版本列中的值。这些是:

200507121201
20151111084520
20151117071001

下表:

mysql> show columns from schema_migrations;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| version | varchar(255) | NO   | PRI | NULL    |       |
+---------+--------------+------+-----+---------+-------+
1 row in set (0.00 sec)

我试图解决这个问题:

 mysql> UPDATE `schema_migrations` SET `version` = '';
 ERROR 1062 (23000): Duplicate entry '' for key 'unique_schema_migrations'


 mysql> alter table schema_migrations drop column version;
 ERROR 1090 (42000): You can't delete all columns with ALTER TABLE; use DROP TABLE instead

总之,我该如何覆盖本专栏中的现有值,并用上面列出的3个值替换它们呢?

看来您需要将所有现有的迁移版本保存在
schema\u migrations
中,因为下次运行
rake db:migrate
时Rails将查找它们。基本上,如果我理解正确,您需要做的唯一一件事就是将重建迁移的时间戳添加到
schema\u迁移中


干杯

我不明白。为什么不将迁移表放到转储中,然后再次运行迁移呢?此外,如果有大量迁移,则无需保留它们。无论如何你都不会退后那么远的。谢谢你的建议。那么你是说我可以删除
schema\u migrations
表,重新运行迁移,然后它就会正确地重新填充它?是的,如果你在一个迁移文件中有所有以前的迁移。但是再看看你的代码,情况似乎不是这样。是的,这也是我的理解,所以我的问题更多的是关于如何在MySQL终端中使用SQL来替换这些值!如果我理解正确,您不需要替换任何东西-您只需要插入新的迁移版本:
insert-INTO-schema_-migrations'version'值('200507121201')、('20151111084520')、('20151117071001')
感谢这个解决方案,这正是我所需要的<代码>从模式迁移中删除
后跟
INSERT-INTO-schema_-migrations“version”值('200507121201')、('20151111084520')、('20151117071001')
同样适用于像我这样的其他SQL新手
INSERT-INTO-schema_-migrations“version”值('200507121201')插入单个值。