Question

Je me retrouve avec un projet Django qui gère deux classes distinctes mappées sur un nom de table similaire:

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'

Le projet utilise une base de données contenant deux schémas: public et foo.

La façon dont cette application est modèle et déployée rend les choses encore plus déroutantes: sur certains serveurs, Django se connecte à la base de données avec l'utilisateur "John", pas membre de tout rôle, mais sur d'autres serveurs, il se connecte avec l'utilisateur "Eric", membre d'un foo rôle.

Deux questions ici:

  1. Si Méta-classe de Django ne mentionne aucun schéma spécifique, Comment Postgres décide-t-il avec quel tableau il fonctionnera ? Jusqu'à présent, il semble que l'utilisateur Eric frappera toujours le foo.bar table, et jamais le public.bar Un, quelle que soit la classe appelée. Avec l'utilisateur "John", j'utilise seulement BarA classe et il frappe correctement public.bar.
  2. Django ne semble pas gérer les schémas; est cette solution Considéré comme une bonne pratique pour ce type de cas (veuillez noter que je ne peux pas renommer les tables existantes)?
Était-ce utile?

La solution

En postgres search_path variable Réglez la priorité pour choisir le schéma pour la table:

Search_Path (String)
Cette variable spécifie l'ordre dans lequel les schémas sont recherchés lorsqu'un objet (tableau, type de données, fonction, etc.) est référencé par un nom simple sans schéma spécifié. Lorsqu'il y a des objets de noms identiques dans différents schémas, celui trouvé en premier dans le chemin de recherche est utilisé.
[...]
La valeur effective actuelle du chemin de recherche peut être examinée via la fonction SQL Current_schemas.

Un moyen rapide de le faire:

SELECT current_schemas(True);

Vous pouvez trouver des détails sur la façon de gérer search_path dans la section 5.7.3. de cet article: http://www.postgresql.org/docs/current/static/ddl-schemas.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top