1

레일스 프로젝트에 기본 표현식이있는 레거시 테이블이 있습니다. 이 표현식은 임의의 4 자리 숫자를 선택하고이를 문자열로 변환합니다. 내 테스트를하는 동안 나는 기본 표현 설정 psql의에이 정확한 문장을 입력 한 :열의 기본 기능을 설정할 때 Postgres가 첫 번째 함수 식별자를 이중 인용 부호로 묶는 이유는 무엇입니까?

default "substring"(to_char(((random() * ((10000 - 1))::double 
precision) + (1)::double precision), '0000'::text), '....$'::text) 

주의 사항 : 포스트 그레스가 정한대로 내가 \d owners이 작업을 수행 할 때 다음

alter table owners alter column signing_code set default 
substring(to_char(((random() * ((10000 - 1))::double precision) + 
(1)::double precision), '0000'::text), '....$'::text); 

입니다 나의 실제 기본 표현이다 첫 번째 함수 식별자 substring 주위의 큰 따옴표 이 레일 스키마 덤프 /로드 두 가지 문제가 발생합니다

  1. 이/schema.rb을 dB로 스키마를 덤핑, 따옴표가 올바르게하여 따옴표를 탈출해도
  2. 탈출하지 않기 때문에 유효하지 않은 루비가 생산된다 스키마를 데이터베이스로 다시로드 할 때 Rails가 표현식이 아닌 표현식이 아닌 기본 문자열 값으로 잘못 표현됩니다 (즉, 작은 따옴표로 표현식을 둘러 쌉니다).

Postgres를 얻는 방법이 있습니까? 제 경우에는 중첩 된 함수 호출에서 첫 번째 함수를 큰 따옴표로 묶지 않습니까? 그것은 좋은 해결 방법이 될 것입니다. 그렇지 않으면 Rails 프로젝트에 버그를 제출할 것입니다.

답변

0

substring 함수가 큰 따옴표를 사용하는 것이 실제로 중요하지 않은 이유는 두 표현식이 기능적으로 동일합니다. PostgreSQL은 기본 표현식을 구문 분석 한 다음 구문 분석 된 버전을 저장하고이 과정에서 substring 식별자는 큰 따옴표가 붙습니다. 당신에게 줄 것이다

check (c in (1, 2, 3)) 

그 제약 조건이있는 테이블에 \d을하는 : 당신은이 같은 CHECK 제약 조건을 추가하면 비슷한 일이 일어날 볼 수 있습니다

CHECK (c = ANY (ARRAY[1, 2, 3])) 

PostgreSQL은 동등한에 in 표현을 변환 = ANY이라는 표현이 내부적으로 사용하기를 원하기 때문입니다. 두 표현식은 기능적으로 동일합니다.

실제 문제는 ActiveRecord가 단일 리터럴 값보다 복잡한 기본 표현식으로 무엇을해야하는지 알지 못한다는 것입니다. AR은 기본값이 어떻게 생겼는지에 대해 잘못된 가정을하고 그 뒤를 혼란스럽게 만들었습니다.

가장 간단한 DDL SQL 이외의 것을 다룰 때 가장 좋은 방법은 db/schema.rb 대신 db/structure.sql을 사용하는 것입니다. structure.sql은 데이터베이스의 원시 덤프/복원 도구를 사용하므로 데이터베이스가 알고있는 모든 것을 이해하고 보존합니다. structure.sql로 전환

은 매우 간단합니다 db:structure:dump 레이크 작업을 사용

config.active_record.schema_format = :sql 
  • 덤프 당신의 structure.sql :

    1. 업데이트 config/application.rb가 올바른 형식을 사용합니다.

    2. 소스 트리 및 개정 컨트롤에서 db/schema.rb을 제거하십시오.

    3. 개정 제어에 db/structure.sql을 추가하십시오.

    4. 스키마를 덤프 및 복원에 대해 서로 다른 갈퀴 작업을 사용하여 손가락을 재교육 :

      • db:structure:dump 대신 db:schema:dump.
      • db:structure:load 대신 db:schema:load입니다.

    난 항상 너무 내 데이터베이스로 작업하는 방법에 대한 제한 structure.sqlschema.rb로 시작합니다.