尝试db:migrate在heroku内部,迁移失败

时间:2018-08-08 23:12:52

标签: ruby-on-rails postgresql heroku

所以我在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中也会出现“ Expected 1 arguments,而得到0”错误。

关于如何解决这个问题的任何想法?迁移可以在开发中进行,因此它只能是Postgres问题(因为我在开发人员中使用SQLite)。

1 个答案:

答案 0 :(得分:2)

一个快速解决方案是删除ChangeDefaultColumnForSetting迁移并编辑CreateSettings来说明:

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

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

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

在那之后,如果要在PostgreSQL上进行部署,您真的想停止使用SQLite。在SQLite之上进行开发并在PostgreSQL上进行部署将引起各种问题。您确实需要使用相同的数据库进行开发,测试和部署。帮自己一个忙,在本地安装PostgreSQL,以便可以使用与部署时相同的数据库进行测试和开发。

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