質問

私は、同様のテーブル名にマッピングされた2つの異なるクラスを処理する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'

このプロジェクトは、2つのスキーマを含むデータベースを使用しています。 publicfoo.

このアプリケーションがテンプレートされて展開される方法は、物事をさらに混乱させます。一部のサーバーでは、Djangoはユーザー「John」とデータベースに接続します。 foo 役割。

ここで2つの質問:

  1. もしも Djangoのメタクラス 特定のスキーマについては言及していません、 Postgresは、どのテーブルで動作するかをどのように決定しますか ?これまでのところ、ユーザーEricが常にヒットするようです foo.bar テーブル、そして決して public.bar 1つは、呼び出されたクラスに関係なく。ユーザー「John」と一緒に、私はしか使用していません BarA クラスとそれが適切にヒットします public.bar.
  2. Djangoはスキーマを扱っていないようです。は このソリューション そのようなケースの良い習慣と見なされます(既存のテーブルの名前を変更できないことに注意してください)?
役に立ちましたか?

解決

Postgresで 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