2

每个人。我正在尝试在 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

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

4

1 回答 1

3

Rails 似乎不支持指定转换或转换函数,PostgreSQL 需要在不存在该类型对的隐式转换的情况下进行数据类型更改。

您需要让 Rails 执行:

ALTER TABLE users ALTER COLUMN col_name SET DATA TYPE morning_meds USING bool(col_name)

而且由于 Rails 显然不允许您USING通过迁移指定子句,因此您需要手动执行。看到这个出色的答案

或者,您可以在迁移前运行:

CREATE FUNCTION bool(text) RETURNS BOOLEAN AS $$
SELECT bool($1); 
$$ LANGUAGE 'sql';

CREATE CAST (text AS boolean) WITH FUNCTION bool(text) AS IMPLICIT;

USING这将允许 ALTER 在没有显式子句的情况下继续进行。您可以并且可能应该在迁移后删除 cast 和 bool(text) 函数:

DROP CAST (text AS boolean);
DROP FUNCTION bool(text);
于 2012-08-16T02:36:15.327 回答