Как использовать схемы в Django?

Я бы хотел использовать схемы postgreSQL с 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, расширяя ее, чтобы попытаться поддержать вашу схему:

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

Ответ 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.

См. 5.7.3. Путь поиска схемы

Ответ 9

Для базы данных SQL Server:

db_table = "[your_schema].[your_table]"