我最终有效地复制了9次迁移。 (我认为这是因为我安装/更新了Gems和/或在我的开发和生产机器上进行了迁移,但现阶段并不完全确定。)
我从生产服务器上的rails目录中移出了一组重复的9,但是现在我想要生产db:migrate
以便运行另一次迁移,我得到了:
$ bundle exec rake db:migrate RAILS_ENV=production
[DEPRECATION WARNING] Nested I18n namespace lookup under "activerecord.attributes.checkout" is no longer supported
== CreatePages: migrating ====================================================
-- create_table(:pages)
rake aborted!
An error has occurred, all later migrations canceled:
Mysql2::Error: Table 'pages' already exists: CREATE TABLE `pages` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `title` varchar(255), `body` text, `slug` varchar(255), `created_at` datetime, `updated_at` datetime) ENGINE=InnoDB
这是因为迁移已经有效地运行了。
我宁愿避免为每一个做db:migrate:down
和db:migrate:up
- 我认为这意味着生产数据库中的数据会丢失。 (在这种情况下,Spree中有几个静态页面。)
有没有办法可以告诉Rails安装忘记所有未完成的迁移,有效地将所有未完成的迁移标记为已完成?
答案 0 :(得分:16)
转到有冲突的迁移文件。
删除内容并保存。
运行rake db:migrate
Ctrl + Z将文件恢复到以前的状态。
这是一个特例,因为我从另一个应用程序复制了数据库,而且我的迁移和内容都存在冲突。
答案 1 :(得分:10)
您可以将迁移的时间戳添加到schema_migrations表。但是,为什么数据库中缺少该表或缺少它需要的行?
很可能是这种特定的迁移已经中途退出并失败了,因此当您尝试再次运行它时,迁移的第一部分将无法像以前那样工作。这是MySQL的一个限制,因为它无法回滚部分失败的迁移更改。另一方面,Postgres可以回滚数据库的结构更改,从而避免此问题。
答案 2 :(得分:9)
默认情况下,rake db:migrate
会运行所有待处理的迁移。所以,为了让你的迁移正确..为了那个..com发布那些迁移,然后将它们恢复正常。它将确保您在将来的迁移中没有问题。