将Rails迁移标记为已迁移

时间:2012-03-07 16:46:50

标签: ruby-on-rails ruby migration

我最终有效地复制了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:downdb:migrate:up - 我认为这意味着生产数据库中的数据会丢失。 (在这种情况下,Spree中有几个静态页面。)

有没有办法可以告诉Rails安装忘记所有未完成的迁移,有效地将所有未完成的迁移标记为已完成?

3 个答案:

答案 0 :(得分:16)

我解决了这个问题:

  1. 转到有冲突的迁移文件。

  2. 删除内容并保存。

  3. 运行rake db:migrate

  4. Ctrl + Z将文件恢复到以前的状态。

  5. 这是一个特例,因为我从另一个应用程序复制了数据库,而且我的迁移和内容都存在冲突。

答案 1 :(得分:10)

您可以将迁移的时间戳添加到schema_migrations表。但是,为什么数据库中缺少该表或缺少它需要的行?

很可能是这种特定的迁移已经中途退出并失败了,因此当您尝试再次运行它时,迁移的第一部分将无法像以前那样工作。这是MySQL的一个限制,因为它无法回滚部分失败的迁移更改。另一方面,Postgres可以回滚数据库的结构更改,从而避免此问题。

答案 2 :(得分:9)

默认情况下,rake db:migrate会运行所有待处理的迁移。所以,为了让你的迁移正确..为了那个..com发布那些迁移,然后将它们恢复正常。它将确保您在将来的迁移中没有问题。