Vra

Ek vind myself met 'n Django -projek wat twee verskillende klasse op 'n soortgelyke tafelnaam gekarteer het:

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'

Die projek gebruik 'n databasis wat twee skemas bevat: public en foo.

Die manier waarop hierdie toepassing getem word en ontplooi word, maak dinge nog meer verwarrend: op sommige bedieners skakel Django aan databasis met die gebruiker "John", nie lid van enige rol nie, maar op ander bedieners skakel dit met die gebruiker "Eric", lid van A foo rol.

Twee vrae hier:

  1. As Django se metaklas noem geen spesifieke skema nie, Hoe besluit Postgres in watter tabel dit gaan werk? ? Tot dusver blyk dit dat die gebruiker Eric altyd die foo.bar tafel, en nooit die public.bar Een, ongeag die genoemde klas. Met gebruiker "John", gebruik ek dit net BarA klas en dit tref behoorlik public.bar.
  2. Dit lyk nie asof Django skemas hanteer nie; is Hierdie oplossing beskou as 'n goeie praktyk vir die soort geval (let daarop dat ek nie die bestaande tabelle kan hernoem nie)?
Was dit nuttig?

Oplossing

In Postgres search_path veranderlik Stel die prioriteit vir die keuse van die skema vir die tabel:

Search_path (String)
Hierdie veranderlike spesifiseer die volgorde waarin skemas gesoek word wanneer 'n voorwerp (tabel, datatipe, funksie, ens.) Met 'n eenvoudige naam verwys word sonder 'n skema wat gespesifiseer is. As daar voorwerpe van identiese name in verskillende skemas is, word die eerste in die soekpad gebruik.
[...]
Die huidige effektiewe waarde van die soekpad kan via die SQL -funksie Current_schemas ondersoek word.

'N Vinnige manier om dit te doen:

SELECT current_schemas(True);

U kan besonderhede vind oor hoe om te bestuur search_path in Afdeling 5.7.3. van hierdie artikel: http://www.postgresql.org/docs/current/static/ddl-schemas.html

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top