문제

비슷한 테이블 이름에 매핑 된 두 개의 별개의 클래스를 처리하는 Django 프로젝트를 통해 나 자신을 찾고 있습니다.

class BarA(models.Model):
[...]
class Meta:
    db_table = 'bar' # doesn't specify any schema

class BarB(models.Model):
[...]
class Meta:
    db_table = u'foo"."bar'

이 프로젝트는 두 개의 스키마를 포함하는 데이터베이스를 사용하고 있습니다. public 그리고 foo.

이 애플리케이션이 템플릿화되고 배포되는 방식은 더욱 혼란스러워집니다. 일부 서버에서 Django는 역할의 구성원이 아니라 다른 서버에서는 A의 구성원 인 "Eric"과 연결됩니다. foo 역할.

여기에 두 가지 질문 :

  1. 만약에 장고의 메타 클래스 특정 스키마를 언급하지 않으며 Postgres는 어떤 테이블과 함께 작동 할 것인지 결정합니까? ? 지금까지 사용자 Eric은 항상 foo.bar 테이블, 그리고 결코 public.bar 하나는 호출 클래스에 관계없이. 사용자 "John"과 함께 사용하고 있습니다 BarA 클래스와 제대로 히트합니다 public.bar.
  2. 장고는 스키마를 처리하지 않는 것 같습니다. ~이다 이 솔루션 그런 종류의 사례에 대한 모범 사례로 간주됩니다 (기존 테이블의 이름을 바꿀 수 없음)?
도움이 되었습니까?

해결책

포스트 그레스에서 search_path 변하기 쉬운 테이블의 스키마를 선택하는 데 우선 순위를 설정하십시오.

search_path (string)
이 변수는 객체 (테이블, 데이터 유형, 함수 등)가 스키마를 지정하지 않은 간단한 이름으로 참조 할 때 스키마를 검색하는 순서를 지정합니다. 다른 스키마에 동일한 이름의 객체가있는 경우 검색 경로에서 처음 발견 된 것들이 사용됩니다.
[...]
검색 경로의 현재 유효 값은 SQL 기능 current_schemas를 통해 검사 할 수 있습니다.

빠른 방법 :

SELECT current_schemas(True);

관리 방법에 대한 세부 정보를 찾을 수 있습니다 search_path 섹션 5.7.3. 이 기사의 : http://www.postgresql.org/docs/current/static/ddl-schemas.html

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