2013-12-03 2 views
0

я окажусь с Джанго обработки двух различных классов, отображенные на аналогичном имени таблицы проекта:Различные схемы, содержащие одни и те же таблицы имен

class BarA(models.Model): 
[...] 
class Meta: 
    db_table = 'bar' # doesn't specify any schema 

class BarB(models.Model): 
[...] 
class Meta: 
    db_table = u'foo"."bar' 

Проект использует базу данных, содержащую две схемы: public и foo.

Способ создания и развертывания этого приложения делает вещи еще более запутанными: на некоторых серверах django подключается к базе данных с пользователем «Джон», не является членом какой-либо роли, но на других серверах он подключается к пользователю «Eric», , член foo.

два вопроса:

  1. Если django's meta class не говоря уже о какой-либо конкретной схемы, каким Postgres решить, какой стол она будет работать с? До сих пор кажется, что пользователь Eric всегда будет попадать в таблицу foo.bar, и никогда не будет public.bar, независимо от вызываемого класса. С пользователем «Джон» я использую только класс BarA, и он правильно удаляет public.bar.
  2. Django, похоже, не обрабатывает схемы; this solution считается хорошей практикой для такого рода случаев (обратите внимание, что я не могу переименовать существующие таблицы)?

ответ

1

В Postgres search_path variable установить приоритет для выбора схемы для таблицы:

search_path (строка)
Эта переменная определяет порядок, в котором схемы ищутся, когда объект (таблица , тип данных, функция и т. д.). ссылается на простое имя без указанной схемы. Когда являются объектами одинаковых имен в разных схемах, используется один найденный , расположенный на пути поиска.
[...]
Текущее эффективное значение пути поиска может быть проверено с помощью функции SQL current_schemas.

Быстрый способ сделать это:

SELECT current_schemas(True); 

Вы можете найти подробную информацию о том, как управлять search_path в разделе 5.7.3. этой статьи: http://www.postgresql.org/docs/current/static/ddl-schemas.html

Смежные вопросы