【问题标题】:Rails 4 how to ignore pending migrationsRails 4如何忽略挂起的迁移
【发布时间】:2013-12-13 04:47:32
【问题描述】:

问题如下:

  • 我的 db/seed.rb 中充满了初始数据。
  • 其中一项迁移取决于此种子提供的数据。
  • 我正在尝试从空数据库部署我的应用程序。

结果是:

  • RAILS_ENV=production rake db:migrate - 由于缺少初始数据而失败
  • RAILS_ENV=production rake db:seed - 由于待定迁移而失败

我想以某种方式告诉 rake 忽略挂起的迁移,但目前无法做到。

更新(由于经验丰富)

有时迁移和模型代码会不同步,因此无法运行迁移。 为了避免这个问题,最近在迁移中重新定义了模型:

# reset all callbacks, hooks, etc for this model
class MyAwesomeModel < ActiveRecord::Base
end

class DoSomethingCool < ActiveRecord::Migration
  def change
    ...
  end
end

【问题讨论】:

  • 您的迁移不应该依赖于您的数据库内容。你能粘贴你的迁移代码吗?

标签: ruby-on-rails ruby activerecord


【解决方案1】:

我不太确定这是否会对您有所帮助。但我一直在寻找一些东西,发现了这个问题。所以看起来这可能会有所帮助:

在 RAILS_ROOT/config/environments/development.rb 将以下设置设置为 false:

 config.active_record.migration_error = false#:page_load

在我的情况下,它现在不再显示待处理的迁移错误。应该适用于相同环境的 rake 任务和控制台。

【讨论】:

  • 你也可以在配置文件中注释掉整行。
  • 这是一个很好的解决方案,可以快速临时解决问题以测试/修复某些东西。修改配置文件后不要忘记重启本地 Rails 服务器。
  • 在 Rails 5.2 中似乎不起作用(在本地加载种子时)
  • 在带有 RSpec 的测试环境中不能在 Rails 6 中工作
  • 这仍然有效吗?即使在配置文件中,Rails 6 似乎也会引发错误。我也重启了服务器。
【解决方案2】:

根据来自的数据重命名迁移:

20140730091353_migration_name.rb

.20140730091353_migration_name.rb

(在文件名的开头添加一个点)

然后运行rake db:seed(它将不再抱怨挂起的迁移),然后重命名迁移。

如果您之后有更多迁移,您必须重命名所有迁移或暂时将其移走。

【讨论】:

  • 不错的技巧!在 Rails 5 中为我工作。
【解决方案3】:

Rails 将迁移信息存储在一个名为 schema_migrations 的表中。

您可以将迁移中的版本添加到该表中以跳过特定迁移。

版本是文件名中描述之前的数字字符串。

[version]_Create_Awesome.rb

【讨论】:

  • 这行得通,现在我要修复我的迁移,以免再次陷入这个陷阱。
【解决方案4】:

我遇到了类似的问题。我注释掉了 add_column 行并运行了 rake db:migrate 命令,然后在测试或生产环境需要它时删除了注释。

【讨论】:

  • 创意!它可以工作,但在将来或在生产中部署时应该小心。
【解决方案5】:

除非您对 Rails 代码进行猴子修补,否则没有任何办法。我强烈建议您改为修复迁移。

迁移不应依赖于数据库中是否存在某些数据。它可以依赖于以前的迁移,但当然绝对不依赖于 db 上的数据。

【讨论】:

  • 你是对的,但是当新服务器需要尽快启动时,我必须做点什么。
【解决方案6】:

如果您在尝试从 正在运行的 Rails 应用程序中植入数据时遇到“待迁移”问题,您可以直接调用它来避免abort_if_pending_migrations 检查:

ActiveRecord::Tasks::DatabaseTasks.load_seed

查看从 ActiveRecord 中实际调用种子的位置:

https://github.com/rails/rails/blob/v6.0.3.2/activerecord/lib/active_record/railties/databases.rake#L331

并查看 DatabaseTasks 文档:

https://apidock.com/rails/v6.0.0/ActiveRecord/Tasks/DatabaseTasks https://apidock.com/rails/v6.0.0/ActiveRecord/Tasks/DatabaseTasks/load_seed

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 2010-11-23
    • 2020-04-29
    • 2017-04-21
    相关资源
    最近更新 更多