2010-08-23 19 views
8

Gestisco un progetto Django con un database che ha diversi vincoli di modello che non sono sincronizzati con il database attuale. Quindi, ad esempio, alcuni campi del modello hanno null = False set, ma il database consente i NULL per la colonna del database corrispondente.Django - Confronta il codice modello nel database

Sono curioso di sapere se esiste un'utilità, in Django o in uno script Python di terze parti, che confronterà l'output di SHOW CREATE TABLE (in questo caso, usando la sintassi MySQL) per ogni tabella e lo confronterò con output python manage.py sql, per evidenziare le discrepanze.

scontato, in una situazione ideale, il database potrebbe non cadere fuori sincrono con il codice del modello Django, in primo luogo, ma dato che è dove sono io, io sono curioso di sapere se c'è una soluzione a questo problema prima che io scriverne uno io o fare il confronto manualmente.

+0

perché non li si confronta con uno strumento diff, come questo http://www.quickdiff.com/index.php? –

+0

@ Gabi- è quello che sto facendo a mano. Ero curioso di sapere se qualcuno avesse creato un'utilità che genera l'output per ognuno che potrei facilmente diff. Come è adesso, funziona bene, ma l'output per ognuno non è allineato, quindi devo farlo table by table. –

risposta

4

./manage.py inspectdb genera il file modello corrispondente ai modelli presenti nel database.

È possibile diffarlo con i file del modello corrente utilizzando un unix standard diff o qualsiasi altra fantasia diffing tool per trovare la differenza e pianificare la strategia di migrazione.

Mentre il primo sembra più semplice e migliore, è anche possibile vedere il diff a livello di sql. ./manage.py sqlall genera lo sql per lo schema db corrente e corrispondentemente show create table table-name mostra lo sql per la creazione della tabella.

Si potrebbe voler fare riferimento a http://code.google.com/p/django-evolution/ che una volta eseguita la migrazione automatica dello stato del db a quello nei modelli correnti. - Nota comunque che questo progetto è vecchio e sembra abbandonato.

+0

Grazie, Lakshman. L'utilità diff funziona molto bene; in effetti, questo è quello che sto usando. Stavo cercando un'utilità che eseguisse tutti i modelli nelle impostazioni.INSTALLED_APPS e mostri sql per ciascuno, quindi SHOW CREATE TABLE sql nel DB, producendo due output simili nella struttura che potrebbero facilmente essere diffusi. So che potrebbe non essere del tutto possibile automatizzare, ma ero curioso se qualcuno avesse risolto il problema. –

+0

Jim, è per questo che ti ho detto di guardare a django-evolution. –

+0

Lakshman, ho dato un'occhiata a django-evolution. Sembra molto utile per la manutenzione del database; grazie per la condivisione. –

3

Ho trovato un modo rapido e sporco per fare quello che ho descritto. Non è perfetto, ma se si esegue ./manage.py testserver, il database di test verrà creato in base al codice del modello. Poi (utilizzando la sintassi MySQL-specifico), è possibile scaricare lo schema per il database regolare e il database di test per i file:

$ mysqldump -uroot -p [database_name] --no-data=true > schema.txt 
$ mysqldump -uroot -p [test_database_name] --no-data=true > test_schema.txt 

Quindi è possibile Schema.txt semplicemente diff e test_schema.txt e trovare le differenze.

+0

Veloce, sporco e di basso livello! Mi piace il fatto che il diff sia nello schema del DB, chiaro e semplice. Grazie. – Fafaman

2

Per PostgreSQL, eseguire un manage.py syncdb su un database temporaneo vuoto, quindi scaricare i database di produzione e temporanei con pg_dump -sOx e confrontare i file risultanti. Tra gli strumenti di visualizzazione visiva, almeno GNOME Meld sembra gestire bene i dump di PostgreSQL.