2012-03-07 199 views
11

我已经结束了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为每一个 - 我认为这将意味着在生产数据库中的数据丢失。 (一对夫妇在这种情况下,在施普雷静态页面。)

有没有一种方法,我可以告诉这个安装的Rails忘记所有优秀的迁移,有效地标记所有未迁移的呢?

回答

6

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

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

+0

谢谢 - 这听起来像它应该做的伎俩。我会试一试。我认为我处在这种情况下,因为涉及的9次迁移在我的dev和prod机器上都创建了一次(因此,实际上相同的迁移有两次迁移,每次迁移都有自己的时间戳)。前9名运行,但我从我的开发机器拉了另外9个,因此对表格的投诉已经存在。我仍然在处理安装和更新Gems的部署方面。 – 2012-03-07 17:09:48

+0

嗯,为什么你有重复的迁移是相同的,但具有不同的时间戳?迁移背后的想法是,你有一套每个人都使用的迁移(即对数据库结构的更改)。然后数据库有一个表来跟踪已经运行的迁移,因此它们不会在每个环境(dev/production)上运行两次。 – 2012-03-08 14:51:37

+0

确实。我认为这可能是因为我之前在两台机器上都安装了Gems(包括它们相关的迁移),却没有意识到这一点。我需要排除工作流程。 – 2012-03-08 18:08:54

8

默认情况下rake db:migrate运行所有未决的迁移。所以,为了让你的迁移正确..为了这些迁移,然后将这些迁移恢复正常。这将确保您在将来的迁移中没问题。

10

我解决了它这样的:

  1. 前往冲突的迁移文件。

  2. 删除内容并保存。

  3. 运行rake db:migrate

  4. 按Ctrl + Z文件到以前的状态。

这是一个特殊情况,因为我从另一个应用程序复制了数据库,而且我有冲突的迁移和其他东西。

+0

是的,这是一个很好的解决方法。谢谢。但我仍然想知道是否有其他解决方案。 – 2014-08-22 05:15:50

+3

想补充说明:不要抹掉整个内容。只要删除类声明和结束之间的所有内容即可。由于文件名和类名称不匹配,删除所有内容将导致此错误:http://stackoverflow.com/questions/17776900/error-on-dbmigrate-uninitialized-constant-devisecreateusers – Dreyfuzz 2015-07-09 20:12:19