web-dev-qa-db-ja.com

Djangoでスキーマを使用する方法は?

DjangoでpostgreSQLスキーマを使用したいのですが、どうすればよいですか?

27
vncprado

多分これは役立つでしょう。

DATABASES = {
    'default': {
        'ENGINE': 'Django.db.backends.postgresql_psycopg2',
        'OPTIONS': {
            'options': '-c search_path=your_schema'
        },
        'NAME': 'your_name',
        'USER': 'your_user',
        'PASSWORD': 'your_password',
        'Host': '127.0.0.1',
        'PORT': '5432',
    }
}

次のリンクから回答が得られます: http://blog.amvtek.com/posts/2014/Jun/13/accessing-multiple-postgres-schemas-from-Django/

28
Ben

私は使用しています:

db_table = '"schema"."tablename"'

過去には、読み取り専用操作でのみ機能することに気付かずに。新しいレコードを追加しようとすると、シーケンスが「schema.tablename」_column_id_seqのようになるため、失敗します。

db_table = 'schema\".\"tablename'

これまでのところ機能します。ありがとう。

27
k4ml

トリッキーなエスケープよりも少し複雑です。チケットを見てください #6148 in Djangoおそらく解決策または少なくともパッチです。Django.dbコアの奥深くでいくつかの小さな変更が加えられますが、うまくいけば、Djangoに正式に含まれています。その後は言うだけです

db_schema = 'whatever_schema'

metaクラスまたはグローバル変更セットの場合

DATABASE_SCHEMA = 'default_schema_name'

settings.pyで

更新:2015-01-08

Djangoの対応する問題は7年間開いており、そこでのパッチは機能しなくなります。これに対する正解は...

現時点では、postgreSQLスキーマをDjangoそのままでは使用できません。

11
kmpm

次のチケットに記載されているように: https://code.djangoproject.com/ticket/6148 、Djangoユーザーにsearch_pathを設定できます。

これを実現する1つの方法は、次のようにpsqlクライアントを介してsearch_pathを設定することです。

ALTER USER my_user SET SEARCH_PATH TO path;

もう1つの方法は、Djangoアプリを変更して、データベースを再構築した場合、Djangoがpublicスキーマのすべてのテーブルを吐き出さないようにすることです。

これを実現するには、 Django.db.backends.postgresql_psycopg2.base で定義されているDatabaseWrapperをオーバーライドできます。

  1. 次のディレクトリを作成します。

    app/pg/
    ├── __init__.py
    └── base.py
    
  2. base.pyの内容は次のとおりです

    from Django.db.backends.postgresql_psycopg2.base import DatabaseWrapper
    
    class DatabaseWrapper(DatabaseWrapper):
        def __init__(self, *args, **kwargs):
            super(DatabaseWrapper, self).__init__(*args, **kwargs)
    
        def _cursor(self):
            cursor = super(DatabaseWrapper, self)._cursor()
            cursor.execute('SET search_path = path')
            return cursor
    
  3. settings.pyに、次のデータベース構成を追加します。

    DATABASES = {
        'default': {
            'ENGINE': 'app.pg',
            'NAME': 'db',
            'USER': 'user',
            'PASSWORD': '',
            'Host': '',
            'PORT': '',
        }
    }
    
7
Mingyu

この問題のパッケージを開発しました: https://github.com/ryannjohnson/Django-schemas

いくつかの構成の後、モデルでset_db()を呼び出すだけです。

model_cls = UserModel.set_db(db='db_alias', schema='schema_name')
user_on_schema = model_cls.objects.get(pk=1)

パッケージは https://stackoverflow.com/a/1628855/5307109 および https://stackoverflow.com/a/18391525/5307109 で説明されている手法を使用してから、ラップしますDjangoモデルで使用するためにそれら。

6
ryannjohnson

私はただ言っていくつかの成功を収めました

db_table = 'schema\".\"tablename'

metaクラスにありますが、それは本当に醜いです。そして、私は限られたシナリオでのみそれを使用しました-あなたが何か複雑なことを試みた場合、それはおそらく壊れるかもしれません。そして、前に言ったように、それは実際にはサポートされていません...

2
Magnus Hagander

これはかなり古い質問であることは知っていますが、別の解決策はSEARCH_PATHを変更することです。

3つのテーブルがあるとしましょう。

  1. schema1.table_name_a
  2. schema2.table_name_b
  3. table_name_c

次のコマンドを実行できます。

SET SEARCH_PATH to public,schema1,schema2;

また、Djangoでのみテーブル名でテーブルを参照してください。

5.7.3。スキーマ検索パス を参照してください。

2
george.erickson

PostgreSQLスキーマの明示的なDjangoサポートはありません。

Django(0.95)を使用する場合、Djangoであるため、PostgreSQLのDjangoデータベースコネクタにsearch_pathを追加する必要がありました。 ORMによって管理されるテーブルが使用するスキーマの指定をサポートしていませんでした。

から取得:

http://nxsy.org/using-postgresql-schemas-with-sqlalchemy-and-elixir

一般的な応答は、SQLAlchemyを使用してSQLを適切に構築することです。

ああ、そしてここにあなたがDjangoベースで何ができるかについてのいくつかの提案を含む別のリンクがあり、あなたのスキームをサポートしようとするためにそれを拡張します:

http://news.ycombinator.com/item?id=662901

2
AlbertoPL

SQL Serverデータベースの場合:

db_table = "[your_schema].[your_table]"
1
DrunkZemin