DjangoでpostgreSQLスキーマを使用したいのですが、どうすればよいですか?
多分これは役立つでしょう。
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/
私は使用しています:
db_table = '"schema"."tablename"'
過去には、読み取り専用操作でのみ機能することに気付かずに。新しいレコードを追加しようとすると、シーケンスが「schema.tablename」_column_id_seqのようになるため、失敗します。
db_table = 'schema\".\"tablename'
これまでのところ機能します。ありがとう。
トリッキーなエスケープよりも少し複雑です。チケットを見てください #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そのままでは使用できません。
次のチケットに記載されているように: 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
をオーバーライドできます。
次のディレクトリを作成します。
app/pg/
├── __init__.py
└── base.py
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
settings.py
に、次のデータベース構成を追加します。
DATABASES = {
'default': {
'ENGINE': 'app.pg',
'NAME': 'db',
'USER': 'user',
'PASSWORD': '',
'Host': '',
'PORT': '',
}
}
この問題のパッケージを開発しました: 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モデルで使用するためにそれら。
私はただ言っていくつかの成功を収めました
db_table = 'schema\".\"tablename'
metaクラスにありますが、それは本当に醜いです。そして、私は限られたシナリオでのみそれを使用しました-あなたが何か複雑なことを試みた場合、それはおそらく壊れるかもしれません。そして、前に言ったように、それは実際にはサポートされていません...
これはかなり古い質問であることは知っていますが、別の解決策はSEARCH_PATHを変更することです。
3つのテーブルがあるとしましょう。
schema1.table_name_a
schema2.table_name_b
table_name_c
次のコマンドを実行できます。
SET SEARCH_PATH to public,schema1,schema2;
また、Djangoでのみテーブル名でテーブルを参照してください。
5.7.3。スキーマ検索パス を参照してください。
PostgreSQLスキーマの明示的なDjangoサポートはありません。
Django(0.95)を使用する場合、Djangoであるため、PostgreSQLのDjangoデータベースコネクタにsearch_pathを追加する必要がありました。 ORMによって管理されるテーブルが使用するスキーマの指定をサポートしていませんでした。
から取得:
http://nxsy.org/using-postgresql-schemas-with-sqlalchemy-and-elixir
一般的な応答は、SQLAlchemyを使用してSQLを適切に構築することです。
ああ、そしてここにあなたがDjangoベースで何ができるかについてのいくつかの提案を含む別のリンクがあり、あなたのスキームをサポートしようとするためにそれを拡張します:
SQL Serverデータベースの場合:
db_table = "[your_schema].[your_table]"