2010-08-23 5 views
8

Ich verwalte ein Django-Projekt mit einer Datenbank, die mehrere Modelleinschränkungen aufweist, die nicht mehr mit der tatsächlichen Datenbank übereinstimmen. So haben beispielsweise einige Modellfelder null = False set, aber die Datenbank lässt NULLs für die entsprechende Datenbankspalte zu.Django - Modellcode mit Datenbank vergleichen

Ich bin neugierig, ob es ein Dienstprogramm gibt, entweder in Django oder einem Python-Skript von Drittanbietern, die die SHOW CREATE TABLE-Ausgabe (in diesem Fall mit MySQL-Syntax) für jede Tabelle vergleichen und mit der vergleichen python manage.py SQL-Ausgabe, um die Diskrepanzen hervorzuheben.

Zugegeben, in einer idealen Situation würde die Datenbank nicht mit dem Django-Modellcode nicht synchron sein, aber da ich dort bin, bin ich neugierig, ob es eine Lösung für dieses Problem gibt, bevor ich schreibe einen selbst oder mache den Vergleich manuell.

+0

Warum vergleichen Sie sie nicht mit einem Diff-Tool, wie diesem http://www.quickdiff.com/index.php? –

+0

@ Gabi- das mache ich von Hand. Ich war neugierig, ob jemand ein Dienstprogramm erstellt hat, das die Ausgabe für jeden erzeugt, den ich leicht differieren könnte. Wie es jetzt ist, das funktioniert gut, aber die Ausgabe für jeden nicht in einer Reihe, also muss ich es Tabelle für Tabelle tun. –

Antwort

4

./manage.py inspectdb generiert die Modelldatei, die den Modellen entspricht, die in der Datenbank vorhanden sind.

Sie können es mit Ihren aktuellen Modelldateien mit einem Standard-Unix-Diff oder einem anderen schicken diffing tool vergleichen, um den Unterschied zu finden und Ihre Migrationsstrategie zu planen.

Während ersteres einfacher und besser aussieht, können Sie auch das Diff auf dem SQL-Level sehen. ./manage.py sqlall generiert die SQL für das aktuelle DB-Schema und entsprechend show create table table-name zeigt die SQL für die Tabellenerstellung.

Sie möchten vielleicht http://code.google.com/p/django-evolution/ verweisen, die den Status der DB automatisch in den aktuellen Modellen migriert hat. - Beachten Sie jedoch, dass dieses Projekt alt ist und aufgegeben scheint.

+0

Danke, Lakshman. Das diff-Dienstprogramm funktioniert sehr gut. tatsächlich verwende ich das. Ich suchte nach einem Dienstprogramm, das alle Modelle in settings.INSTALLED_APPS durchlaufen und die sql für jedes und dann die SHOW CREATE TABLE sql in der DB anzeigen würde, die zwei Ausgaben hervorbrachte, die in der Struktur ähnlich sind, die leicht diffediert werden konnte. Ich weiß, dass das vielleicht nicht vollständig automatisierbar ist, aber ich war neugierig, ob jemand das Problem gelöst hat. –

+0

Jim, deshalb habe ich dich erwähnt, um dir Django-Evolution anzusehen. –

+0

Lakshman, ich habe mir die Django-Evolution angeschaut. Sieht sehr nützlich für die Datenbankwartung aus; danke für das Teilen. –

3

Ich hatte ein schnelles und dreckiges Mittel, um das zu tun, was ich beschrieben habe. Es ist nicht perfekt, aber wenn Sie ./manage.py testserver ausführen, wird die Testdatenbank basierend auf dem Modellcode erstellt. Dann ist (mit MySQL-spezifischen Syntax), können Sie das Schema für die reguläre Datenbank-Dump und der Testdatenbank zu Dateien:

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

Dann können Sie einfach diff Schema.txt und test_schema.txt und die Unterschiede finden.

+0

Schnell und schmutzig und niedriges Niveau! Ich mag die Tatsache, dass das Diff auf dem DB-Schema ist, schlicht und einfach. Vielen Dank. – Fafaman

2

Für PostgreSQL, tun Sie eine manage.py syncdb für eine temporäre leere Datenbank, dann dump Produktion und temporäre Datenbanken mit pg_dump -sOx und vergleichen Sie die resultierenden Dateien. Unter den visuellen Diff-Tools scheint zumindest GNOME Meld gut mit PostgreSQL-Dumps zurecht zu kommen.

Verwandte Themen