Elixir: Tables an Entities anpassen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
glocke
User
Beiträge: 66
Registriert: Mittwoch 23. Februar 2011, 21:18

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
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

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.
Benutzeravatar
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
glocke
User
Beiträge: 66
Registriert: Mittwoch 23. Februar 2011, 21:18

Guten Morgen :)
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?
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.
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".
Es geht um eine effektiv schon laufende Datenbank. Durch einige Updates will muss ich die Datenbankstruktur ändern.

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.
Das "schönste" wäre aber, wenn der ORM-Mapper die ALTER TABLE Befehle selbständig ausführt, anstatt zu meckern, dass er die Felder an den Tabellen nicht finden kann. Allerdings habe ich bei Elixir keinen Weg dafür gefunden.

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
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

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.
glocke
User
Beiträge: 66
Registriert: Mittwoch 23. Februar 2011, 21:18

sparrow 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.
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 Schnapsidee :D

LG Glocke
Antworten