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

问题描述

这里是初学者,部署到 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,: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"