【问题标题】:Rails Migration - PG::Error: ERROR: invalid input syntax for integer: ""Rails 迁移 - PG::Error: 错误:整数的输入语法无效:“”
【发布时间】:2014-03-30 10:19:08
【问题描述】:
我正在尝试将我的代码部署到 heroku,但我收到了错误
-- execute("ALTER TABLE lodges ALTER COLUMN image TYPE integer USING (image::integer)")
PG::Error: ERROR: invalid input syntax for integer: ""
: ALTER TABLE lodges ALTER COLUMN image TYPE integer USING (image::integer)
rake aborted!
我的迁移是
class ChangeDataTypeForLodgesImage < ActiveRecord::Migration
def change
execute "ALTER TABLE lodges ALTER COLUMN image TYPE integer USING (image::integer)"
end
end
【问题讨论】:
标签:
ruby-on-rails
postgresql
activerecord
ruby-on-rails-4
rails-migrations
【解决方案1】:
该错误告诉您lodges.image 列中有空字符串,您不能将空字符串转换为整数。在更改列类型之前,您必须修复损坏的数据。修复取决于您希望空字符串是什么;一种可能性是将它们转换为 NULL:
execute %q{
update lodges
set image = null
where image = ''
}
execute "ALTER TABLE lodges ALTER COLUMN image TYPE integer USING (image::integer)"
或者您可能希望空字符串为零:
execute %q{
update lodges
set image = '0'
where image = ''
}
execute "ALTER TABLE lodges ALTER COLUMN image TYPE integer USING (image::integer)"
可能还有其他值无法转换为整数,您必须以类似方式清理它们。
【解决方案2】:
这个问题的另一个解决方案是创建一个函数。我为此苦苦挣扎了几个小时,所以认为值得发布解决方案。我首先创建一个函数将列中的所有 char 值转换为整数
CREATE OR REPLACE FUNCTION char_to_integer(char character varying)
RETURNS integer AS
$BODY$
SELECT CASE WHEN trim($1) SIMILAR TO '[0-9]+'
THEN CAST(trim($1) AS integer)
ELSE NULL END;
$BODY$
LANGUAGE 'sql' IMMUTABLE STRICT;
现在使用 USING 语法,我们可以用这个命令解决这个烦人的问题。
ALTER TABLE table_name ALTER COLUMN column_name TYPE integer USING char_to_integer(column_name);