Domanda

Mi trovo con un progetto Django che gestisce due classi distinte mappate su un nome da tavolo simile:

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'

Il progetto utilizza un database contenente due schemi: public e foo.

Il modo in cui questa applicazione è modellata e distribuita rende le cose ancora più confuse: su alcuni server, Django si collega al database con l'utente "John", non membro di alcun ruolo, ma su altri server si collega con l'utente "Eric", membro di A foo ruolo.

Due domande qui:

  1. Se Meta Class di Django non menziona uno schema specifico, In che modo Postgres decide con quale tabella funzionerà ? Finora, sembra che l'utente Eric colpirà sempre il foo.bar tavolo e mai il public.bar uno, indipendentemente dalla classe chiamata. Con l'utente "John", sto solo usando BarA classe e colpisce correttamente public.bar.
  2. Django non sembra gestire gli schemi; è questa soluzione Considerata una buona pratica per quel tipo di caso (si prega di notare che non posso rinominare le tabelle esistenti)?
È stato utile?

Soluzione

In Postgres search_path variabile Imposta la priorità per la scelta dello schema per la tabella:

Search_path (String)
Questa variabile specifica l'ordine in cui gli schemi vengono cercati quando un oggetto (tabella, tipo di dati, funzione, ecc.) Viene referenziato da un nome semplice senza schema specificato. Quando ci sono oggetti di nomi identici in diversi schemi, viene utilizzato quello trovato per primo nel percorso di ricerca.
[...]
L'attuale valore effettivo del percorso di ricerca può essere esaminato tramite la funzione SQL corrente_schemas.

Un modo rapido per farlo:

SELECT current_schemas(True);

Puoi trovare dettagli su come gestire search_path Nella sezione 5.7.3. di questo articolo: http://www.postgresql.org/docs/current/static/ddl-schemas.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top