MySQL Schema_迁移-活动记录-更新值
我们遗留的Rails应用程序有一些不完整的迁移(所以我们将我们的迁移)集成到一个大型迁移中,为它编写了一个rake任务,所有这些都非常有效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
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')代码>插入单个值。