为什么我的数据库迁移无法正常工作以及如何解决?

时间:2012-08-16 01:37:48

标签: ruby-on-rails postgresql heroku

大家。我正在尝试在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

我不确定如何修复错误或导致错误的原因,所以你能给我的任何帮助都会很棒!

1 个答案:

答案 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);