DB Update für Django, ein Konzept
Veröffentlich am 08.11.2008, 11:17
Ich habe mir heute morgen einige Schema Evolution Tools für Django angesehen. django-evolution fällt aufgrund schlechter Erfahrung aus, dmigrations kommt nicht in Frage da nur MySQL unterstützt wird.
Bis jetzt mache ich meine Datenbank-Änderungen manuell mit einem Ordner voller sql Dateien, für jede Änderung eine Datei. Das klappt auch super, einziges Manko: man muss wissen, bei welcher "Version" man mit dem ausführen der sql Dateien beginnt.
Diesen Vorgang möchte ich nun automatisieren. Grundsätzlich muss erwähnt werden, das ich solch ein Tool nur für das Aktualisieren von Webseiten, die sich bereits im Produktionsbetrieb befinden, verwenden würde. Zum Zeitpunkt der Entwicklung ist die Erstellung der Änderungsscripte zu aufwändig.
Die Anwendung und Vorgehensweise stelle ich mir wie folgt vor:
Es existiert ein Model welches für jedes Model die aktuelle Version speichert:
class ModelVersion(models.Model):
model = models.ForeignKey(ContentType, unique=True)
version = models.PositiveIntegerField()
.. für in jeder Application existiert ein Python Modul "dbupdates" welches ein Dictionary CHANGES enthält:
CHANGES = {
1, (
'ATLER TABLE myapp_mymodel ADD COLUMN ...',
),
2, (
'ALTER TABLE myapp_mymodel DROP COLUMN ...',
'DROP TABLE ...',
),
}
.. um Änderungen auszuführen, wird folgender Befehl ausgeführt:
alle Anwendungen aktualisieren:
./manage dbupdate
oder nur eine Anwendung aktualisieren:
./manage dbupdate [application]
Alternativ kann über den Parameter --startat=version die Startversion übergeben werden (ich merkte bereits an, das die Version zum Zeitpunkt des Checkouts bekannt sein muss, dannach wird die aktuelle Version in der Datenbank gespeichert.
Möglich ist auch, die CHANGES optional Datenbank-abhängig zu gestalten um auf eigenarten gewisser RDBMS einzugehen.
Soweit meine Idee, Feedback ist ausdrücklich erwünscht. Entweder als Kommentar, per Mail oder im IRC (#django-de / Freenode).
Nachtrag: Ich muss feststellen, dass ich hier bis auf wenige Kleinigekeiten dmigrations "nachbaue". Jedoch sehe ich derzeit keine andere Möglichkeit, da dmigrations ausschließlich mit MySQL arbeitet. Abgesehen davon wäre dmigrations jedoch genau das richtige für meine Anwendungszwecke.
Tags: database, dbupdate, django, schema evolution