0

내가 Heroku가 내 코드를 배포하려고하고 내가 오류를 얻을이레일 마이그레이션 - PG : 오류 : ERROR : 정수에 대한 잘못된 입력 구문 ""

-- 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 열에 빈 문자열이 있고 정수로 빈 문자열을 캐스팅 할 수 없다는 오류가 표시됩니다. 열 유형을 변경하기 전에 깨진 데이터를 수정해야합니다. 수정 사항은 빈 문자열을 원하는대로 결정됩니다. 하나의 가능성은 널 (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)" 

당신이 정수로 캐스팅 할 수없는 다른 값이있을 수 있습니다, 당신이 ' 마찬가지로 그들을 청소해야합니다.

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); 
관련 문제