Modo giusto per creare tipi personalizzati di pgsql in django
-
20-08-2019 - |
Domanda
Qual è il modo giusto per creare tipi pgsql personalizzati per l'applicazione django in modo che ogni volta che si crea un database con syncdb, tutti i tipi personalizzati vengano creati prima di creare qualsiasi tabella (in modo che le tabelle possano usare questo tipo)?
Uso anche django-evolution, ma questa non è una soluzione appropriata & # 8212; funziona dopo syncdb. Posso immaginare una soluzione alternativa come la definizione di modelli con tipi di campo standard e quindi la creazione di tipi e l'alterazione dei tipi di colonna nelle evoluzioni, ma sicuramente non è carino e in qualche modo oscuro ...
Qualche idea?
Soluzione
Non credo che ci sia un modo per farlo in Django. Come probabilmente saprai, c'è un segnale post_syncdb
ma nessun segnale per pre_syncdb
.
Quindi penso che ci siano solo due opzioni: l'hacking cluster
segnale in Django o utilizzare uno strumento di automazione come Fabric .
Attaccare il tuo segnale <=>, anche se è il modo giusto per farlo, probabilmente non sarà semplice e dovrai mantenere la patch ogni nuova versione di Django.
D'altra parte, non solo uno strumento di automazione come Fabric è semplice, ma offre altri vantaggi al tuo progetto.
Ad esempio, una parte del mio Fabfile è simile a:
def createdb():
"Create a clean database"
run('createdb --encoding=UNICODE $(db_name) -O $(db_owner) -U $(db_owner)')
run('python manage.py syncdb --noinput')
Aggiungi qualcosa del genere appena prima del syncdb:
run('psql -U $(db_owner) $(db_name) < app/sql/custom_types.sql')
e dovresti essere bravo a scrivere semplicemente:
$ fab createdb
o
$ fab cluster createdb
per eseguire il comando su tutte le macchine elencate nel tuo ambiente chiamato <=>.