Rails 6.0 迁移文件根据 Postgres 首选项转换为整数?

Rails 6.0 Migration file convert to integer as per Postgres preference?

这里是初学者,正在部署到 Heroku。 Sqlite3 在开发中,PG 在生产中。

此时测试环境已成功完成所有迁移运行。

我正在尝试部署到 Heroku。 git 工作正常。但是当我 运行 heroku run rails db:migrate 我得到以下错误

== 20210116010525 ChangeMediaLinksRefToInteger: migrating =====================
-- change_column(:media_links, :media_category_id, :integer)
D, [2021-01-16T19:33:04.056111 #4] DEBUG -- :    (1.4ms)  BEGIN
D, [2021-01-16T19:33:04.060684 #4] DEBUG -- :    (4.1ms)  ALTER TABLE "media_links" ALTER COLUMN "media_category_id" TYPE integer
D, [2021-01-16T19:33:04.066364 #4] DEBUG -- :    (5.0ms)  ROLLBACK
D, [2021-01-16T19:33:04.072867 #4] DEBUG -- :    (6.0ms)  SELECT pg_advisory_unlock(4856957400867515370)
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::DatatypeMismatch: ERROR:  column "media_category_id" cannot be cast automatically to type integer
HINT:  You might need to specify "USING media_category_id::integer".

注意:此迁移是我之前自己进行的错误更正,我不小心将 'media_category_id' 设置为字符串。我创建此迁移是为了将列从字符串更改为整数。迁移文件:

class ChangeMediaLinksRefToInteger < ActiveRecord::Migration[6.0]
  def change
    change_column :media_links, :media_category_id, :integer
  end
end

可以更新此迁移 文件还是我应该创建一个新的 文件? 这是 Heroku 告诉我要做的吗?

class ChangeMediaLinksRefToInteger < ActiveRecord::Migration[6.0]
  def change
    change_column :media_links, "USING media_category_id::integer"
  end
end

由于迁移失败,您可以将迁移编辑为 Heroku 推荐的内容。

如果迁移 运行 成功并且您想编辑它,您可以回滚迁移 ./bin/rails db:rollback 然后编辑文件,然后再次 运行 迁移。

如果您想更改已部署到公共测试环境或 PreProd/Prod 的迁移,那么最好创建一个新的迁移以在顶部应用更改。

这对我有用:

change_column :orders, :pay_type, "integer USING NULLIF(pay_type, '')::int"