Frage

Ich finde mich mit einem Django -Projekt mit zwei verschiedenen Klassen um, die auf einen ähnlichen Tabellennamen zugeordnet sind:

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'

Das Projekt verwendet eine Datenbank mit zwei Schemas: public und foo.

Die Art und Weise, wie diese Anwendung vorläuft und bereitgestellt wird foo Rolle.

Zwei Fragen hier:

  1. Wenn Djangos Metaklasse Erwähnt kein bestimmtes Schema, Wie entscheiden Postgres, mit welcher Tabelle es funktionieren wird? ? Bisher scheint es, dass der Benutzer Eric immer auf die klettern wird foo.bar Tisch und niemals die public.bar Erstens, unabhängig von der genannten Klasse. Mit dem Benutzer "John" benutze ich nur BarA Klasse und es trifft richtig public.bar.
  2. Django scheint nicht mit Schemas umzugehen; ist diese Lösung Als gute Praxis für diese Art von Fall angesehen (bitte beachten Sie, dass ich die vorhandenen Tabellen nicht umbenennen kann).
War es hilfreich?

Lösung

In Postgres search_path Variable Legen Sie die Priorität für die Auswahl des Schemas für die Tabelle fest:

Search_path (String)
Diese Variable gibt die Reihenfolge an, in der Schemata gesucht werden, wenn ein Objekt (Tabelle, Datentyp, Funktion usw.) durch einen einfachen Namen ohne angegebenes Schema verwiesen wird. Wenn es Objekte identischer Namen in verschiedenen Schemata gibt, wird der erste im Suchpfad verwendet.
[...]
Der aktuelle effektive Wert des Suchpfads kann über die SQL -Funktion current_schemas untersucht werden.

Ein schneller Weg, dies zu tun:

SELECT current_schemas(True);

Sie können Details zum Verwalten finden search_path In Abschnitt 5.7.3. von diesem Artikel: http://www.postgresql.org/docs/current/static/ddl-schemas.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top