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); 
相關問題