2008-09-18 4 views
2

SQL 스크립트를 실행하여 새 Postgres 스키마를 만드는 마이그레이션이 있습니다. 기본적으로 Postgres에 새 데이터베이스를 만들 때 우리가 사용하는 기본 스키마 인 'public'이라는 스키마를 만듭니다. 새 데이터베이스 스키마를 만드는 마이그레이션이 정상적으로 작동하는 것 같습니다.하지만 마이그레이션이 실행 된 후 레일스가 의존하는 'schema_info'테이블을 업데이트하려고 할 때 문제가 발생합니다. 새 데이터베이스 스키마에서 찾고 실제로 테이블이있는 기본 '공개'스키마가 아닙니다.Ruby on Rails 마이그레이션 - 새 데이터베이스 스키마 만들기

누구나이 테이블의 '공용'스키마를보기 위해 레일스에 어떻게 말할 수 있는지 알고 있습니까? SQL의

예 실행되는 : ~

CREATE SCHEMA new_schema; 
COMMENT ON SCHEMA new_schema IS 'this is the new Postgres database schema to sit along side the "public" schema'; 
-- various tables, triggers and functions created in new_schema 

오류가 발생하고 ~ 당신의 도움에 대한

RuntimeError: ERROR C42P01 Mrelation "schema_info" does not exist 
L221 RRangeVarGetRelid: UPDATE schema_info SET version = ?? 

감사

크리스 나이트

+0

레일 DB 스키마에 대해 이야기 할 때 및 포스트그레스 스키마에 대해 이야기 할 때 질문을 편집 할 수 있습니다. – kch

+0

또한 예제와 이름 지정에 도움이됩니다. 문제에 대한 추상적 인 설명은 앱과 관련이없는 우리를 파악하기가 어렵습니다. – kch

+0

귀하의 database.yml은 어떻게 구성되어 있습니까? –

답변

5

마이 그 레이션의 모양, database.yml의 모양 및 시도하려는 대상에 따라 다릅니다. 어쨌든 더 많은 정보가 필요하다. 예제 database.yml과 마이 그 레이션을 게시해야한다면 이름을 변경한다. 마이그레이션이 예를 들어 어댑터의 search_path를 변경합니까?

하지만 레일과 postgresql 스키마는 잘 작동하지 않습니다 (아직?).

문제가있는 곳이 몇 군데 있습니다. Try와 build 그리고 dev와 test를위한 기본이 아닌 두개의 스키마가있는 단 하나의 pg 데이터베이스를 사용하는 app을 만들고 그것에 대해 말해 보라. (다음부터는 이미 화상을 입을 것이라고 말할 수 있습니다.)

어쩌면 내가 마지막으로 재생 한 이후로 수정되었지만 http://rails.lighthouseapp.com/projects/8994/tickets/390-postgres-adapter-quotes-table-name-breaks-when-non-default-schema-is-used 또는 http://rails.lighthouseapp.com/projects/8994/tickets/918-postgresql-tables-not-generating-correct-schema-list 또는 postgresql_adapter를 볼 수 있습니다.

# Drops a PostgreSQL database 
    # 
    # Example: 
    # drop_database 'matt_development' 
    def drop_database(name) #:nodoc: 
    execute "DROP DATABASE IF EXISTS #{name}" 
    end 

(예 이것은 당신이 dev에 테스트 모두 서로 다른 스키마와 동일한 데이터베이스를 사용하는 경우,이 두 데이터베이스 당신이 단위 테스트를 실행할 때마다 드롭 것이 잘못이다!)

실제로 시작 쓰는 경우 rb 패치. 첫 번째는 일부 조건에서 중복 된 인덱스로 끝나는 search_path에 대해 신경 쓰지 않는 어댑터의 인덱스 메소드에 대한 것이 었습니다. 그런 다음 나머지 부분에 상처를 입히고 스키마 사용에 대한 아이디어를 포기했습니다. 응용 프로그램이 완료되었고 스키마를 사용하여 문제를 해결하는 데 추가 시간이 필요하지 않았습니다.

+0

감사합니다. search_path가 변경되었지만 공개로 재설정되지 않았습니다. –

0

잘 모르겠어요 I 당신이 정확히 무엇을 요구하는지 이해하지만 레이크는 레일 버전을 업데이트 할 것으로 예상됩니다. 스키마를 schema_info 테이블에 추가합니다. database.yml 설정 파일을 확인하십시오. rake가 업데이트 할 테이블을 찾을 곳입니다.

새 Postgres 스키마로 마이그레이션 중이며 레이크가 여전히 이전 것을 가리킬 가능성이 있습니까? 표준 Rails 마이그레이션이 필요한 것을 확신하지 못합니다. 대신 자신의 레이크 작업을 만드는 것이 가장 좋습니다.

편집 : 두 개의 다른 데이터베이스 또는 Postgres 스키마를 참조하는 경우 레일스는 표준 마이그레이션에서이 기능을 지원하지 않습니다. 레일스는 하나의 데이터베이스를 가정하기 때문에 한 데이터베이스에서 다른 데이터베이스로의 마이그레이션은 일반적으로 불가능합니다. "rake db : migrate"를 실행하면 실제로 RAILS_ENV 환경 변수를보고 database.yml에 올바른 항목을 찾습니다. 레이크가 database.yml에서 "개발"환경과 데이터베이스 설정을 보면서 마이그레이션을 시작하면 마이그레이션이 끝날 때이 환경으로 업데이트 될 것으로 예상됩니다.

그래서 Rails에서 두 데이터베이스를 동시에 참조 할 수 없으므로 레일스 스택 외부에서이 작업을 수행해야 할 수도 있습니다. 이것을 허용하는 플러그인 시도가 있지만, 그들은 크게 해킹되어 제대로 작동하지 않습니다.

0

pg_power을 사용할 수 있습니다. PostgreSQL 스키마를 생성하기위한 마이그레이션을위한 추가 DSL을 제공합니다.