大家。我正在尝试在Heroku上运行我的数据库(postgre)的迁移,当我运行它时,我收到以下错误:
PGError:错误:列“morning_meds”无法强制转换为“pg_catalog.bool”类型 :ALTER TABLE“users”ALTER COLUMN“morning_meds”TYPE boolean
有问题的迁移文件包含以下代码:
class ChangeUserMedsFieldsToBoolean < ActiveRecord::Migration
def down
change_column :users, :morning_meds, :string
change_column :users, :lunch_meds, :string
change_column :users, :night_meds, :string
end
def up
change_column :users, :morning_meds, :boolean
change_column :users, :lunch_meds, :boolean
change_column :users, :night_meds, :boolean
end
end
我不确定如何修复错误或导致错误的原因,所以你能给我的任何帮助都会很棒!
答案 0 :(得分:3)
似乎Rails不支持指定强制转换或转换函数,PostgreSQL在数据类型更改时需要这些函数,而不存在对该类型对的隐式强制转换。
你需要让Rails执行:
ALTER TABLE users ALTER COLUMN col_name SET DATA TYPE morning_meds USING bool(col_name)
由于Rails显然不允许您通过迁移指定USING
子句,因此您需要手动执行此操作。请参阅this excellent answer。
或者,你可以在迁移前运行:
CREATE FUNCTION bool(text) RETURNS BOOLEAN AS $$
SELECT bool($1);
$$ LANGUAGE 'sql';
CREATE CAST (text AS boolean) WITH FUNCTION bool(text) AS IMPLICIT;
这将允许ALTER在没有明确USING
子句的情况下继续。您可以并且可能应该在迁移后删除强制转换和bool(文本)函数:
DROP CAST (text AS boolean);
DROP FUNCTION bool(text);