Как использовать схемы в Django? - PullRequest
25 голосов
/ 21 июля 2009

Я хотел бы использовать схемы postgreSQL с django, как мне это сделать?

Ответы [ 9 ]

27 голосов
/ 27 октября 2009

Я использую:

db_table = '"schema"."tablename"'

в прошлом, не понимая, что работает только для операции только для чтения. При попытке добавить новую запись произойдет сбой, поскольку последовательность будет выглядеть примерно так: «имя_таблицы» _column_id_seq.

db_table = 'schema\".\"tablename'

работает до сих пор. Спасибо.

26 голосов
/ 11 февраля 2015

Может быть, это поможет.

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/

11 голосов
/ 16 декабря 2009

Это немного сложнее, чем хитрое спасение. Взгляните на Ticket # 6148 в Django, чтобы найти решение или хотя бы патч. В ядро ​​django.db внесены незначительные изменения, но, надеюсь, он будет официально включен в django. После этого нужно просто сказать

db_schema = 'whatever_schema'

в классе Meta или для набора глобальных изменений

DATABASE_SCHEMA = 'default_schema_name'

в settings.py

ОБНОВЛЕНИЕ: 2015-01-08

Соответствующая проблема в django была открыта в течение 7 лет, и патч там больше не будет работать. Правильный ответ на это должен быть ...

В настоящий момент вы не можете использовать схемы django из коробки в PostgreSQL.

7 голосов
/ 23 августа 2013

Как указано в следующем билете: 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

  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': '',
        }
    }
    
6 голосов
/ 18 февраля 2016

Я только что разработал пакет для этой проблемы: 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.

2 голосов
/ 11 марта 2013

Я знаю, что это довольно старый вопрос, но другое решение - изменить SEARCH_PATH.

Пример

Допустим, у вас есть три стола.

  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 голосов
/ 22 июля 2009

Я добился некоторого успеха, просто сказав

db_table = 'schema\".\"tablename'

в классе Мета, но это действительно ужасно. И я использовал его только в ограниченных сценариях - он может сломаться, если вы попробуете что-то сложное. И, как было сказано ранее, это не очень поддерживается ...

2 голосов
/ 21 июля 2009

Нет явной поддержки 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

1 голос
/ 28 ноября 2017

Для базы данных сервера SQL:

db_table = "[your_schema].[your_table]"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...