我正在尝试将我的代码部署到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
答案 0 :(得分:2)
该错误告诉您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)"
可能还有其他值无法转换为整数,您必须同样清理它们。
答案 1 :(得分:0)
此问题的另一个解决方案是创建一个函数。几个小时我一直在努力,所以认为值得发布解决方案。我首先创建一个函数来将列中的所有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);