Я бы хотел использовать схемы postgreSQL с django, как я могу это сделать?
Как использовать схемы в Django?
Ответ 1
Я использовал:
db_table = '"schema"."tablename"'
в прошлом, не понимая, что работают только для работы только для чтения. Когда вы пытаетесь добавить новую запись, она не сработает, потому что последовательность будет похожа на "schema.tablename" _column_id_seq.
db_table = 'schema\".\"tablename'
работает до сих пор. Спасибо.
Ответ 2
Возможно, это поможет.
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/
Ответ 3
Это немного сложнее, чем сложное экранирование. Посмотрите на Ticket # 6148 в Django, возможно, на решение или хотя бы на патч. Он делает некоторые незначительные изменения в глубине ядра django.db, но, мы надеемся, будет официально включен в django. После этого это просто вопрос
db_schema = 'whatever_schema'
в классе Meta или для глобального набора изменений
DATABASE_SCHEMA = 'default_schema_name'
в settings.py
ОБНОВЛЕНИЕ: 2015-01-08
Соответствующая проблема в django открыта в течение 7 лет, и исправление там больше не будет работать. Правильный ответ на этот вопрос должен быть...
В настоящий момент вы не можете использовать схемы postgreSQL в django из коробки.
Ответ 4
Как указано в следующем билете:
https://code.djangoproject.com/ticket/6148, мы могли бы установить search_path
для пользователя django.
Один из способов добиться этого - установить search_path
через psql
клиент, например
ALTER USER my_user SET SEARCH_PATH TO path;
Другой способ - изменить приложение django, так что, если мы перестроим базу данных, django не будет переплевывать все таблицы в схеме public
.
Чтобы достичь этого, вы можете переопределить DatabaseWrapper
, определенный в django.db.backends.postgresql_psycopg2.base
-
Создайте следующий каталог:
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': '', } }
Ответ 5
Я только что разработал пакет для этой проблемы: 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)
В пакете используются методы, описанные в fooobar.com/questions/75241/... и fooobar.com/questions/75241/..., затем обертывают их для использования с моделями Django.
Ответ 6
Нет явной поддержки Django для схем postgreSQL.
При использовании Django (0.95) нам пришлось добавить путь search_path к соединителю базы данных Django для PostgreSQL, поскольку Django не поддерживал указание схемы, что таблицы, управляемые используемым ORM.
Взято из:
http://nxsy.org/using-postgresql-schemas-with-sqlalchemy-and-elixir
Общий ответ - использовать SQLAlchemy для правильной сборки SQL.
О, и вот еще одна ссылка с некоторыми предложениями о том, что вы можете сделать с базой Django, расширяя ее, чтобы попытаться поддержать вашу схему:
Ответ 7
У меня был некоторый успех, просто говоря
db_table = 'schema\".\"tablename'
в классе Meta, но это действительно уродливо. И я использовал его только в ограниченных сценариях - он может сломаться, если вы попробуете что-то сложное. И, как говорилось ранее, он не поддерживается на самом деле...
Ответ 8
Я знаю, что это довольно старый вопрос, но другое решение - изменить SEARCH_PATH.
Пример
Допустим, у вас три таблицы.
-
schema1.table_name_a
-
schema2.table_name_b
-
table_name_c
Вы можете выполнить команду:
SET SEARCH_PATH to public,schema1,schema2;
И ссылайтесь на таблицы по их именам таблиц только в django.
Ответ 9
Для базы данных SQL Server:
db_table = "[your_schema].[your_table]"