Hallo,
ich konnte bisher nichts derartiges finden, daher frage ich mal direkt danach:
Ich suche einen Mechanismus, der die Tabellen einer MySQL-Datenbank an die durch von Entity-abgeleitete Struktur anpasst. Mein Problem ist, dass ich z.B. ein Feld hinzufügen will und nicht jedesmal die Datenbank leeren und mit setup_all() und create_all() wieder herrichten will. Gibt es eine andere Möglichkeit?
Bisher benutze ich ein Shell-Skript, dass "DROP DATABASE foo; CREATE DATABASE foo;" via MySQL-Konsolenclient an die DB senden. Notfalls würde ich das Shell-Skript durch mein Python-Skript ausführen lassen, aber das ist keine "schöne" Lösung finde ich.
LG Glocke
Elixir: Tables an Entities anpassen
Ein komplexes Thema.
Das kommt auf die "Umgebung" an. Reden wir hier von einer Anwendung beim Kunden, die bereits läuft und die Datenbank muss für ein neues Release angepasst werden? Da gibt es verschiedene Möglichkeiten, such mal nach "Datenbank Migration".
Wenn es nur zum Testen ist, und die Daten darin eh egal sind, weil du dein Datenbankschema ständig anpasst, dann ist es wahrscheinlich einfacher die Datenbank/Tabellen einfach zu löschen und von deinem ORM-Mapper einfach neu anlegen zu lassen.
Das kommt auf die "Umgebung" an. Reden wir hier von einer Anwendung beim Kunden, die bereits läuft und die Datenbank muss für ein neues Release angepasst werden? Da gibt es verschiedene Möglichkeiten, such mal nach "Datenbank Migration".
Wenn es nur zum Testen ist, und die Daten darin eh egal sind, weil du dein Datenbankschema ständig anpasst, dann ist es wahrscheinlich einfacher die Datenbank/Tabellen einfach zu löschen und von deinem ORM-Mapper einfach neu anlegen zu lassen.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Wenn sich Dein DB-Schema ständig ändert, dann ist das relationale Konzept der falsche Ansatz. Dieses setzt ein statisches Schema eben voraus. Evtl. fährst DU mit einer Schema freien DB besser?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Guten Morgen
Beispiel: Ich habe eine Tabelle X mit Feldern a, b und c. Nach einer Weile brauch ich ein Feld d, will allerdings alle Daten behalten.
Die Möglichkeiten die ich sehe sind:
Zum Hintergrund: Primär geht es mir um mein Browsergame-Projekt, was sich derzeit in einer zweiten Closed-Beta-Phase befindet. Da ich dort immer mal noch Dinge ändere oder etwas fehlt, stoße ich auf das genannte Problem Es ist also bisher noch nicht tragisch, die DB komplett zu resetten, wird aber tragisch sobald es mal mehr als 5 Leute testen (die 5 kann man ja noch mal fix informieren und dabei mit Rücksicht auf die Situation rechnen ... "ist ja nur close-beta^^")
LG Glocke
Ich ändere das Schema nicht ständig^^. Manchmal komme ich aber nicht daran vorbei, größere Sachen zu ändern oder hinzuzufügen, so dass ich die DB-Struktur verändern muss.Hyperion hat geschrieben:Wenn sich Dein DB-Schema ständig ändert, dann ist das relationale Konzept der falsche Ansatz. Dieses setzt ein statisches Schema eben voraus. Evtl. fährst DU mit einer Schema freien DB besser?
Es geht um eine effektiv schon laufende Datenbank. Durch einige Updates will muss ich die Datenbankstruktur ändern.sparrow hat geschrieben:Reden wir hier von einer Anwendung beim Kunden, die bereits läuft und die Datenbank muss für ein neues Release angepasst werden? Da gibt es verschiedene Möglichkeiten, such mal nach "Datenbank Migration".
Beispiel: Ich habe eine Tabelle X mit Feldern a, b und c. Nach einer Weile brauch ich ein Feld d, will allerdings alle Daten behalten.
Die Möglichkeiten die ich sehe sind:
- Alle Datensätze (via mysqldump > backup.sql) auslesen und temporär auf der Festplatte speichern. Datenbank killen, Tabellen vom ORM-Mapper neu erstellen lassen und die (zuvor gespeicherte SQL-)File mit den Daten (via mysql < backup.sql) importieren. Solang keine neuen Felder "not null" sind, sollte das kein Problem sein. Diese Variante erscheint mir am ehesten geeignet.
- Die Änderungen an den Tabellen händisch (über den Konsolenclient) durch ALTER TABLE durchführen ... gefällt mir nicht
- Weitere Tabellen erstellen, die vom ORM-Mapper automatisch hinzugefügt werden. Dann gebe ich der Tabelle X, eine property names d, welche die weitere Tabelle anspricht und entsprechend das Query durchführt, Werte schreibt usw. Das funktioniert zwar super, führt imho aber auf Dauer zu schlechter wartbarem Code.
Zum Hintergrund: Primär geht es mir um mein Browsergame-Projekt, was sich derzeit in einer zweiten Closed-Beta-Phase befindet. Da ich dort immer mal noch Dinge ändere oder etwas fehlt, stoße ich auf das genannte Problem Es ist also bisher noch nicht tragisch, die DB komplett zu resetten, wird aber tragisch sobald es mal mehr als 5 Leute testen (die 5 kann man ja noch mal fix informieren und dabei mit Rücksicht auf die Situation rechnen ... "ist ja nur close-beta^^")
LG Glocke
Dann hast du für die Migration des Schemas im Groben 2 Möglichkeiten:
1) Du lässt die entsprechenden Befehle (ALTER TABLE, etc.) von deinem Script ausführen (wobei es vorher wissen müsste auf welchem Stand das alte Schema ist, ob eine Anpassung notwendig ist). Wobei ma die dann normalerweise in eine extra Datei schreibt und von dort "holt" um die Übersicht zu bewahren.
2) Du suchst dir ein Tool, welches das mit SQLAlchemy oder Elixir kann. Migrationstools gibt es, welche da aktuell sind weiß ich nicht. Ich bevorzuge 1.
1) Du lässt die entsprechenden Befehle (ALTER TABLE, etc.) von deinem Script ausführen (wobei es vorher wissen müsste auf welchem Stand das alte Schema ist, ob eine Anpassung notwendig ist). Wobei ma die dann normalerweise in eine extra Datei schreibt und von dort "holt" um die Übersicht zu bewahren.
2) Du suchst dir ein Tool, welches das mit SQLAlchemy oder Elixir kann. Migrationstools gibt es, welche da aktuell sind weiß ich nicht. Ich bevorzuge 1.
Also schreibe ich mir, wenn ich eine Tabelle-Spalte hinzufüge oder entferne, parallel ein update.sql Skript, das ich dann in die Datenbank werfe? Klingt erstmal überschaubar und gut realisierbar. Und da du die Variante bevorzugst, klingt's noch besser. Also keine Schnapsideesparrow hat geschrieben:1) Du lässt die entsprechenden Befehle (ALTER TABLE, etc.) von deinem Script ausführen (wobei es vorher wissen müsste auf welchem Stand das alte Schema ist, ob eine Anpassung notwendig ist). Wobei ma die dann normalerweise in eine extra Datei schreibt und von dort "holt" um die Übersicht zu bewahren.
LG Glocke