2013-01-01 5 views
1

레일즈 3.2.8 애플리케이션 용 DB 테이블이 PostgreSQL 데이터베이스로 있습니다. 이 DB에는 유형이 boolean 인 열이 있습니다. 열에 값이 채워져 있습니다. boolean에서 모든 문자열로 값을 변경하고 싶습니다.Rails 3.2.8의 PostgreSQL DB에서 전체 열의 데이터 유형 변경

마이그레이션을 실행하여 열 유형을 변경할 수 있다는 것을 알았습니다. 그러나 이러한 마이그레이션을 수행 할 때 값에 어떤 일이 발생하는지 확신 할 수 없기 때문에이 작업을 수행하고 싶지 않습니다. 따라서 booleanfalse은 "거짓"으로 변경되고 부울 true은 "참"으로 변경됩니까?

그렇다면이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

+0

이 프로덕션 데이터베이스입니다 같은 것을 생성해야합니까? –

+0

해당 개발 DB 없음 – banditKing

답변

3

당신은 아마 'true''false'를 얻을 수 있습니다 : 그 보장 그리고 내가 부울 그래서 당신이 할 수 있습니다 않습니다 캐스트를 텍스트 무엇에 대한 권위있는 참조를 찾을 수없는 경우

psql> create table t (c boolean not null); 
psql> insert into t (c) values (TRUE), (FALSE); 
psql> alter table t alter column c type text; 
psql> select * from t; 
    c 
------- 
true 
false 

는 잘 모르겠어요 이들의 PostgreSQL 버전에서 무슨 말을했는지 확인하십시오

psql> select TRUE::text; 
psql> select FALSE::text; 

수동으로 변환을 지정하기 위해 다음 USING을 사용할 수 있습니다 'True''False'을 보장하려면 :

선택적 USING 절은 이전 열에서 새 열 값을 계산하는 방법을 지정합니다. 생략하면 기본 변환은 이전 데이터 유형에서 new 로의 배역 캐스팅과 동일합니다. 당신이 레일은 다음 캐스트 부울 - 투 - 텍스트의 기본을 얻을 것이다 표준 마이그레이션로 변환을 수행 할 경우 경우,

alter table t 
alter column c type text 
using case c when TRUE then 'True' when FALSE then 'False' else NULL end 

:

그래서 당신은이 문제를 강제로 말할 수 SQL ALTER TABLE을 사용하여 유형을 수동으로 변경하면 발생하는 일을 제어 할 수 있습니다. 당신은 마이그레이션 내부 중 하나를 수행 할 수 있습니다

def up 
    change_column :t, :c, :text 
end 

여담으로

def up 
    connection.execute(%q{ 
     alter table ... 
    }) 
end 

대, I 텍스트 열에 대한 부울 열을 포기의 논리를 질문해야 할 것, 나에게 뒤로 조금 보인다 . 난 그냥 단지 9.1에 그것을 시도

change_column :table_name, :column_name, :string 

:

0

당신은 괜찮을 것이다. 그냥 PostgreSQL을 버전이 반응하는 방법을 확인하기 위해 테스트 테이블에 pg_dump test_db > test.sql

당신은 SQL을 시뮬레이션 할 수 있습니다를 백업, 레일

ALTER TABLE my_table ALTER COLUMN col TYPE varchar(128); 
관련 문제