Различные схемы, содержащие одинаковые имена таблиц

StackOverflow https://stackoverflow.com/questions/20353840

  •  25-08-2022
  •  | 
  •  

Вопрос

Я обнаружил, что с проектом Django обрабатывает два различных класса, нанесенные на таблицу схожих названий таблицы:

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 подключается к базе данных с пользователем «John», а не с какой -либо роли, но на других серверах, которые он соединяется с пользователем «Eric», членом foo роль.

Два вопроса здесь:

  1. Если Мета класса Джанго не упоминает какую -либо конкретную схему, Как Postgres решает, с какой таблицей он будет работать с ? Пока кажется, что пользователь Эрик всегда нажимает foo.bar стол, и никогда public.bar один, независимо от называемого класса. С пользователем "John" я использую только BarA класс, и он правильно попадает public.bar.
  2. Джанго, кажется, не справляется с схемами; является это решение Считается хорошей практикой для такого вида случая (обратите внимание, что я не могу переименовать существующие таблицы)?
Это было полезно?

Решение

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

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

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

SELECT current_schemas(True);

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top