0

我尝试部署我的代码的Heroku和我得到的错误Rails的迁移 - PG ::错误:错误:整数无效的输入语法:“”

-- 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 

回答

2

该错误告诉你lodges.image列中有空字符串,并且不能将空字符串转换为整数。在更改列类型之前,您必须修复损坏的数据。修复取决于你想要的空字符串是什么;一个可能性是将它们转换为空值:

execute %q{ 
    update lodges 
    set image = null 
    where image = '' 
} 
execute "ALTER TABLE lodges ALTER COLUMN image TYPE integer USING (image::integer)" 

或者你想空字符串的为0:

execute %q{ 
    update lodges 
    set image = '0' 
    where image = '' 
} 
execute "ALTER TABLE lodges ALTER COLUMN image TYPE integer USING (image::integer)" 

有可能是你无法投射到整数其他值,你”我们必须同样清理它们。

0

此问题的另一个解决方案是创建一个函数。我苦苦挣扎了好几个小时,所以认为值得发布解决方案。我首先创建一个函数的所有字符值转换列整数

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; 

现在用使用的语法,就可以解决这个恼人的问题与此命令。

ALTER TABLE table_name ALTER COLUMN column_name TYPE integer USING char_to_integer(column_name); 
相关问题