【问题标题】:Trying to db:migrate inside of heroku, migration is failing it尝试 db:migrate 在 heroku 内部,迁移失败
【发布时间】:2018-08-08 23:12:52
【问题描述】:

所以我在我的 Rails 项目中进行了这个迁移:

class CreateSettings < ActiveRecord::Migration[5.2]
  def change
    create_table :settings do |t|
      t.string :frequency
      t.text :emails, array: true, default: [].to_yaml
      t.integer :reorder

      t.timestamps
    end
  end
end

默认值最初是失败的,所以我创建了另一个迁移以删除该默认值:

class ChangeDefaultColumnForSetting < ActiveRecord::Migration[5.2]
  def change
    change_column_default(:settings, :emails, nil)
  end
end

架构现在看起来不错,并且该默认值消失了,但是当我将其推送到 Heroku 并运行 heroku run rails db:migrate 时,它在最初的 CreateSettings 迁移中失败,因为它仍然包含默认值。即使我手动从第一次迁移中删除该默认值,我也会在 Heroku 中收到“预期 1 参数但得到 0”错误。

有什么想法可以解决这个问题吗?迁移在开发中有效,所以它一定只是 Postgres 问题(因为我在开发中使用 SQLite)。

【问题讨论】:

    标签: ruby-on-rails postgresql heroku


    【解决方案1】:

    快速解决方法是删除 ChangeDefaultColumnForSetting 迁移并编辑 CreateSettings 说:

    t.text :emails, array: true, default: []
    

    t.text :emails, array: true, default: nil
    

    然后提交更改并推送到 Heroku。

    之后,如果您在 PostgreSQL 上部署,您真的想停止使用 SQLite。在 SQLite 之上开发并在 PostgreSQL 上部署会导致各种问题。您确实需要使用同一个数据库进行开发、测试和部署。帮自己一个大忙,在本地安装 PostgreSQL,这样您就可以使用与部署相同的数据库进行测试和开发。

    或者,您可以在迁移中查看Rails.env,并在不同的环境中运行不同的代码。但实际上,这是个坏主意。

    【讨论】:

    • 你是救命稻草
    猜你喜欢
    • 2015-01-13
    • 1970-01-01
    • 2011-06-29
    • 2015-06-26
    • 2011-02-16
    • 2017-01-07
    • 2011-08-05
    • 1970-01-01
    • 2011-10-09
    相关资源
    最近更新 更多