问题描述
这里是初学者,部署到 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"