2012-09-05 3 views
3

SO 텍스트 필드 대 문자열에 관한 질문 2를 찾은 후, 나는 링크 필드 가 이미 발견 텍스트 :PostgreSQL의 텍스트 필드에 글자 수 제한 255 자의 오류가있는 이유는 무엇입니까?

ActiveRecord::StatementInvalid: PG::Error: ERROR: value too long for type character varying(255) 
:

create_table "answers", :force => true do |t| 
    t.string "text" 
    t.text  "link" 

왜 포스트 그레스는 다음과 같은 오류를 던지고있다

나는 change_column :answers, :link, :text, :limit => nil 이주를 시도했다 그러나 나는 아무것도하지 않는다고 생각하지 않는다.

편집 : 그래서, 문제는 스키마 필드 텍스트입니다 말한다, 그러나 실제로는 문자열입니다

Answer.new.column_for_attribute('link').type 
=> :string 

를 해결하는 가장 좋은 방법은 무엇입니까는? 스키마에서 데이터베이스를 재 구축하면됩니까? 문자열로 변경 한 다음 텍스트로 다시 변경 하시겠습니까?

레일즈 3.2.2, 포스트 그레스 9, 헤로쿠.

+1

단지 $ 0.02이지만, 다소 신비한'create_table'과 친구들을 사용하여 Rails 마이그레이션을 작성하는 것을 피합니다. PostgreSQL/MySQL을위한 적절한 문장을 실행합니다. 내 스키마가 어떻게 생겼는지 정확히 알고 싶습니다 (유형, 인덱스, 제약 조건 등). – d11wtq

+1

PostgreSQL에서는'text' 칼럼에 제한이 없으며 'character'와'character varying'의 제한이 각각 1이고 제한이 없으므로 테이블을 생성하는 코드는 명시 적으로 255 제한을 지정해야합니다. 따라서 PostgreSQL은 의도 한대로 작동합니다. – aib

+1

"text"란 이름의 칼럼이 아닌가? 나는 당신이 생각하는대로 것들을 확인하기 위해 다른 수단 (psql)을 통해 db에 연결했다. 마이그레이션은 내 경험에서 잘 행동하는 경향이 있습니다. 아마도 당신이 그것을 실행 한 후에 이주가 변경되었을 것입니까? – eevar

답변

1

하지 그것이 어떻게 일어 났는지 확신하지만, 다음 중 하나 :

  1. 그래서 실제로 동기화이었다 마이그레이션을 실행 한 후 스키마를 확인했습니다.
  2. 형식을 문자열로 변경하여 스키마를 동기화 한 마이그레이션을 실행했습니다.
0

Postgres로 전송 된 원시 SQL 문을 사용하여 마이그레이션을 작성하십시오. 그냥 execute을 psql 콘솔에서 직접 실행하면됩니다. DB가 남아있는 상태를 정확히 알 수있는 가장 좋은 방법입니다. 종종 레일스가 스키마를 정의하는 것보다 더 나은 해결책입니다. 특히 이주를 실행 한 후에는 정기적으로 스키마를보아야합니다.

관련 문제