【问题标题】:Rake db:migrate catch errorsRake db:migrate 捕获错误
【发布时间】:2014-07-16 03:53:44
【问题描述】:

我已将我的开发数据库与我的生产数据库同步,现在似乎有很多迁移已应用于此数据库,但 rake 不知道这一点。有很多,其中也有一些被应用。

所以每次我 rake db:migrate 运行一些迁移,然后它在“表已存在”或“列已存在”处停止

有没有办法告诉 rake 发生了什么,或者更好的是,我可以将一个参数传递给 rake db:migrate 告诉它忽略“已经存在”的错误并继续前进。

【问题讨论】:

  • 为什么不直接指定一个版本号来只迁移需要的?
  • 我的版本号在 schema.rb 中是正确的。问题是不知何故,未应用的迁移混合在应用的迁移之间

标签: mysql ruby-on-rails database ruby-on-rails-3 database-migration


【解决方案1】:

您可以在create_table 上指定force: true 参数以强制它删除表并重新创建它,这通常可以绕过这些错误。但是,这似乎是解决问题的一种蛮力方式。

当您从生产环境中转储架构并在本地加载时,通常会出现此问题。生产模式对本地的新表一无所知,它会复制 schema_migrations 的整个列表,因此您在本地运行迁移的事实就丢失了。

解决此问题的一种方法是从转储中跳过schema_migrations 表。您仍然会在本地加载所有生产数据,但不会覆盖本地迁移列表。

使用 mysqldump 是添加--ignore-table=schema_migrations 参数的问题。

但是,您需要谨慎使用解决此问题的任何方法。跳过迁移非常容易,因为它会创建一个表而忘记它还会向现有表添加一列。

我通常更喜欢手动方法,或者将值添加到 schema_migrations 以用于我知道在本地发生的迁移。或者只是在我在本地重新运行它们时注释掉导致问题的迁移部分。两者都不是特别好,但我知道我没有在本地错过任何步骤。

【讨论】:

  • 你在哪里添加--ignore-table=schema_migrations参数?
  • 类似:mysqldump -u the_user -p the_database --ignore-table=schema_migrations > the_output.sql
猜你喜欢
  • 2013-09-03
  • 2018-10-06
  • 1970-01-01
  • 2017-03-01
  • 2018-02-05
  • 2011-10-07
  • 1970-01-01
  • 2014-07-31
  • 2015-12-13
相关资源
最近更新 更多