Rails迁移使用转换将字符串转换为整数

时间:2014-03-14 01:06:46

标签: postgresql ruby-on-rails-4 rails-migrations

有一个很好的问题here我想详细说明。我正在尝试将数据库中的列转换为字符串形式。

我认为转换非常直接。目前我的字符串是

["10", "12", "125", "135", "140", ...]

我的迁移文件包括:

def change
    change_column :table_name, :product_code, :integer
end

Rails尝试这个,但是Postgresql发回错误。

  

PG ::错误:错误:列" product_code"不能自动转换为类型整数
  提示:指定USING表达式以执行转换。

我不确定我是如何使用这个'使用'在我的rails迁移中表达。

所以我认为转换非常简单。我应该使用什么作为USING表达式?

3 个答案:

答案 0 :(得分:29)

change_column :table_name, :product_code,
  'integer USING CAST(product_code AS integer)'

来源: http://makandracards.com/makandra/18691-postgresql-vs-rails-migration-how-to-change-columns-from-string-to-integer

答案 1 :(得分:13)

调整后的代码也支持转换空白字符串:

change_column :table_name, :product_code, 
  "integer USING NULLIF(product_code, '')::int"

空字符串变为NULL,在类型转换时变为0,这可能是您在这种情况下可以做的最好。

答案 2 :(得分:0)

当您编写Rails迁移以将字符串列转换为整数时,您通常会这样写:

change_column :table_name, :column_name, :integer

你可能会得到这个:

PG::DatatypeMismatch: ERROR:  column "column_name" cannot be cast automatically to type integer
HINT:  Specify a USING expression to perform the conversion.

"提示"基本上告诉你,你需要确认你是否希望这种情况发生,以及如何转换数据。只需在迁移中说明这一点:

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'