문제

새 Postgres 스키마를 생성하기 위해 SQL 스크립트를 실행하는 마이그레이션이 있습니다.Postgres에서 새 데이터베이스를 생성할 때 기본적으로 우리가 사용하는 기본 스키마인 'public'이라는 스키마가 생성됩니다.새 데이터베이스 스키마를 생성하기 위한 마이그레이션이 제대로 작동하는 것 같지만, 마이그레이션이 실행된 후 Rails가 의존하는 'schema_info' 테이블을 업데이트하려고 할 때 마치 존재하지 않는 것처럼 나타나는 문제가 발생합니다. 테이블이 실제로 있는 기본 '공용' 스키마가 아닌 새 데이터베이스 스키마에서 이를 찾습니다.

레일에게 이 테이블의 '공개' 스키마를 보도록 지시하는 방법을 아는 사람이 있습니까?

실행 중인 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 = ??

당신의 도움을 주셔서 감사합니다

크리스 나이트

도움이 되었습니까?

해결책

마이그레이션이 어떻게 생겼는지, Database.yml이 어떻게 생겼는지, 그리고 정확히 무엇을 시도하려고 하는지에 따라 다릅니다.어쨌든 더 많은 정보가 필요하면 이름을 변경하고 데이터베이스.yml 예제와 마이그레이션을 게시해야 합니다.예를 들어 마이그레이션으로 인해 어댑터의 search_path가 변경됩니까?

그러나 일반 레일과 postgresql 스키마는 (아직?) 함께 잘 작동하지 않는다는 것을 알고 있습니다.

문제가 있는 곳이 몇 군데 있습니다.기본이 아닌 스키마 2개(개발용 스키마 하나, 테스트용 스키마 하나)가 포함된 하나의 pg 데이터베이스만 사용하는 앱을 빌드하고 이에 대해 알려주세요.(다음에서 나는 이미 당신이 화상을 입을 것이라고 말할 수 있습니다)

어쩌면 마지막으로 가지고 놀았을 때부터 고쳐졌을 수도 있지만, 제가 봤을 때 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-geneating-corright-schema-list 또는 postgresql_adapter.rb에 있습니다.

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

(예, 개발과 테스트 모두에 대해 서로 다른 스키마를 가진 동일한 데이터베이스를 사용하는 경우 이는 잘못된 것입니다. 이렇게 하면 단위 테스트를 실행할 때마다 두 데이터베이스가 모두 삭제됩니다!)

실제로 패치를 작성하기 시작했습니다.첫 번째는 일부 조건에서 중복된 인덱스로 끝나는 search_path에 대해 신경 쓰지 않는 어댑터의 인덱스 메서드에 대한 것이었습니다. 그런 다음 나머지 때문에 상처를 입기 시작했고 결국 스키마 사용 아이디어를 포기하게 되었습니다.나는 얻고 싶었다 나의 앱이 완료되었지만 스키마 사용 시 발생한 문제를 해결하는 데 필요한 추가 시간이 없었습니다.

다른 팁

질문하신 내용이 정확히 무엇인지 잘 모르겠지만, rake는 Rails 스키마 버전을 Schema_info 테이블로 업데이트할 것으로 예상하고 있습니다.Database.yml 구성 파일을 확인하세요. 이 파일은 rake가 업데이트할 테이블을 찾는 곳입니다.

새로운 Postgres 스키마로 마이그레이션하고 있는데 rake가 여전히 이전 스키마를 가리키고 있을 가능성이 있습니까?표준 Rails 마이그레이션이 필요한지 확실하지 않습니다.대신 자신만의 레이크 작업을 만드는 것이 가장 좋습니다.

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

따라서 Rails 내에서 동시에 두 개의 데이터베이스를 참조할 수 없으므로 Rails 스택 외부에서 이 작업을 수행해야 할 것입니다.이를 허용하는 플러그인이 시도되고 있지만 대부분 해킹되어 제대로 작동하지 않습니다.

당신이 사용할 수있는 pg_power.PostgreSQL 스키마를 생성하는 것뿐만 아니라 마이그레이션을 위한 추가 DSL도 제공합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top