복붙노트

[RUBY-ON-RAILS] 레일의 긴 문자열에 열 유형 변경

RUBY-ON-RAILS

레일의 긴 문자열에 열 유형 변경

첫 번째 마이그레이션에서, 나는 문자열이 될 수있는 열 내용에 선언 액티브은 주석 보석에 따라 캐릭터 (255)로했다.

내가 입력하면 255보다 긴 문자열 콘텐츠 형태로 포스트 그레스를 사용 Heroku가 앱을 밀어 후 나는 오류

PGError: ERROR: value too long for type character varying(255)

문제는 내가 (무료 텍스트, 문자의 수천 수) 매우 긴 아마도 문자열을 포함하는 콘텐츠가 필요하다

감사

해결법

  1. ==============================

    1.당신이 어떤 길이 제한 문자열을 원하는 경우는 레일과 텍스트를 사용합니다. 이 같은 마이그레이션 :

    당신이 어떤 길이 제한 문자열을 원하는 경우는 레일과 텍스트를 사용합니다. 이 같은 마이그레이션 :

    def up
      change_column :your_table, :your_column, :text
    end
    def down
      # This might cause trouble if you have strings longer
      # than 255 characters.
      change_column :your_table, :your_column, :string
    end
    

    물건을 분류해야한다. 당신은 할 수 있습니다 : 널 (null) => 허위 또는 너무 그 말에 대한 몇 가지 다른 옵션을.

    제한 => 255 그러나 텍스트를 사용하는 경우, 당신은 임의의 어떤 길이 문자열은 데이터베이스 지원을 입력 얻을 것이다 : 당신이 명시 적 제한없이 문자열 열을 사용하는 경우, 레일는 암시를 추가합니다. PostgreSQL은 당신이 길이없는 VARCHAR 열을 사용할 수 있지만, 대부분의 데이터베이스는 길이없이 VARCHAR에 대해 알고하지 않는 및 레일에 대한 별도의 형식을 사용합니다. 당신은 PostgreSQL을에 텍스트 컬럼을 얻기 위해 레일에 텍스트를 사용해야합니다. 텍스트를 입력하고 varchar 형 중 하나의 열 사이의 PostgreSQL의 차이 (그러나 VARCHAR (n)이 다릅니다)은 없습니다. 또한, PostgreSQL의 상단에 당신이있는 거 배포하는 경우, 사용할 필요가 없습니다 : 전혀 문자열 (일명 VARCHAR)는 데이터베이스 취급 텍스트와 (N) VARCHAR 내부적으로 VARCHAR에 대한 여분의 길이 제약 (N)을 제외하고는 같은; 외부 제약이있는 경우 열 크기 (예 : 23 자 할 것이다 형태로 897 / B에 해당 필드 (432)를 말한다 정부의 형태로) : 만 (문자열 AKA) VARCHAR (N)를 사용한다.

    한계가 있음을 자신에게 알림으로 제한하고는 제한이 초과되지 않도록하기 위해 모델의 검증이 있어야합니다 당신은 문자열 열 어디를 사용하는 경우 제쳐두고, 당신은 항상를 지정해야합니다. 당신이 한계를 초과하는 경우, PostgreSQL은 불평과 예외를 발생, MySQL은 조용히 문자열을 자르거나 (서버 구성에 따라) 불평,있는 그대로 SQLite는 그것을 통과하게되며, 다른 데이터베이스는 (아마도 불평) 다른 일을 할 것입니다 것입니다 .

    또한, 당신은 또한 개발, 테스트, 및 (보통 Heroku가에서 PostgreSQL의 것) 같은 데이터베이스의 상단에 배치해야합니다, 당신도 데이터베이스 서버의 동일한 버전을 사용해야합니다. 액티브는 당신을 절연되지 않습니다 (예 : GROUP BY의 동작 등) 데이터베이스 간의 다른 차이가 있습니다. 이미이 일을 할 수도 있지만 어쨌든 그것을 말할 줄 알았는데.

  2. ==============================

    2.허용 대답이 우수하지만, 나 자신과 같은 비 전문가를 들어, 원래 포스터 질문 2 부 여기 잘하면 더 나은 거래를 대답을 추가하고 싶었다.

    허용 대답이 우수하지만, 나 자신과 같은 비 전문가를 들어, 원래 포스터 질문 2 부 여기 잘하면 더 나은 거래를 대답을 추가하고 싶었다.

    생성 골격 마이그레이션

    당신은 (당신 열 이름에 대한 당신의 테이블 이름 테이블 및 열 교환) 콘솔에 입력하여 변경 사항을 유지하기 위해 마이그레이션을 생성 할 수 있습니다

    rails generate migration change_table_column
    

    당신이 응용 프로그램 / DB / 마이그레이션 / 폴더를 레일 안쪽이 골격 마이그레이션을 생성합니다. 이 마이그레이션은 마이그레이션 코드에 대한 자리 표시 자입니다.

    예를 들어 나는 테이블이라고 TodoItems에, 텍스트 문자열에서 열 유형을 변경하는 마이그레이션을 만들려면 :

    class ChangeTodoItemsDescription < ActiveRecord::Migration
      def change
         # enter code here
         change_column :todo_items, :description, :text
      end
    end
    

    마이그레이션을 실행

    당신이 열을 변경하는 코드를 입력하면 바로 실행

    rake db:migrate
    

    마이그레이션을 적용합니다. 당신이 실수를하면 당신은 항상 함께 변화를 되돌릴 수 있습니다 :

    rake db:rollack
    

    위, 아래 방법

    허용 대답 참조 위, 아래 방법 대신 새로운 변경 방법. 레일 이후 3.2 이전 스타일 위, 아래 방법은 새로운 변화의 방법을 통해 몇 가지 장점을 제시했다. '위, 아래'회피 액티브 :: IrreversibleMigration 예외. 레일 4의 출시 이후로이 오류를 피하기 위해 뒤집을 사용할 수 있습니다 :

    class ChangeProductsPrice < ActiveRecord::Migration
      def change
        reversible do |dir|
          change_table :products do |t|
            dir.up   { t.change :price, :string }
            dir.down { t.change :price, :integer }
          end
        end
      end
    end
    

    레일을 즐길 수 :)

  3. from https://stackoverflow.com/questions/8694273/changing-a-column-type-to-longer-strings-in-rails by cc-by-sa and MIT license