Welcher ORM erstellt / update auch das Datenbank Schema?

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Hand
User
Beiträge: 65
Registriert: Sonntag 28. Januar 2007, 14:28

Hallo,

ich will eine Datenbankstruktur in python als Klassen bzw. Dicts abbilden.
Python soll beim Starten dann die DB Struktur anlegen bzw. entsprechend altern.
Gibt es einen ORM der so eine Funktion schon eingebaut hat?

SQLAlchemy z.B. setzt vorraus, dass die DB schon exisitiert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hand hat geschrieben: SQLAlchemy z.B. setzt vorraus, dass die DB schon exisitiert.
Äh... tut es das? Aber selbst wenn... wieso ist das so "schlimm"?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

SQLAlchemy setzt nicht voraus dass die Datenbank existiert, allerdings kann man die Datenbank nicht einfach verändern. Veränderungen lassen sich aber auch nicht mit jedem DBMS machen, zumindest nicht gleich gut.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

South für Django beherrscht Schema-Migration für Djangos ORM.

Ansonsten vielleicht einfach keine relationale DB mit festem Schema nehmen sondern etwas wie MongoDB oder CouchDB, da erübrigt sich dann die Notwendigkeit zur Schema-Migration.

Stefan
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@hand: Du legst die Struktur doch i.d.R. nur 1x an - beim ersten Start. Wenn du dein Skript zum 2x, zum 3x... startest legst du die DB doch nicht neu an, oder?

Je nachdem wie die Struktur aussieht, bietet sich auch ein KV-Store an. Da kannst du den Key nach einem x-beliebigen Schema aufbauen.

Oder wie sma schon sagt was schemaloses.

Gruß, noisefloor
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

noisefloor hat geschrieben:Je nachdem wie die Struktur aussieht, bietet sich auch ein KV-Store an.
Stimmt. Redis ist ziemlich cool. Funktioniert allerdings am besten, wenn die Menge der Daten noch in den Hauptspeicher passt. Bei heutigen Rechner häufig kein Problem. Ich finde z.B. ziemlich beachtlich, was für Rechner die Leute z.B. auf der mongodb-ML oder cassandra-ML einzusetzen angeben. 16GB oder 24GB muss da als klein gelten, 8 GB ist winzig.

Stefan
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Stimmt. Redis ist ziemlich cool.
+1. Was ich persönlich wirklich klasse finde ist das Beispiel in der Redis-Doku, wo die die Struktur für einen Twitter-Clone entwickeln. Sehr anschaulich. Da kann man sogar drüber hinweg sehen, dass das Ding später in PHP programmiert wird. ;-)

Gruß, noisefloor
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

noisefloor hat geschrieben:Was ich persönlich wirklich klasse finde ist das Beispiel in der Redis-Doku, wo die die Struktur für einen Twitter-Clone entwickeln.
Hier → http://gist.github.com/445239 eine quick'n'dirty-Variante mit Python.

Stefan
Hand
User
Beiträge: 65
Registriert: Sonntag 28. Januar 2007, 14:28

Die Datenbank wird nachtraeglich erweitert, ausgeliefert wird nur das Programm.
Daher soll sich die DB automatisch an das Programm anpassen.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

egal wie man es dreht und wendet - IMHO spricht einiges gegen eine relationale DB. Gründe:
  • Bei einer relationalen DB beginnt man üblicherweise mit dem Entwurf der DB, damit nachher auch alles sinnvoll geordnet ist. Geht bei dir aber nicht, weil die eben die Endstruktur nicht kennst.
  • Da du die Struktur nicht kennst, musst du bei jedem Programmstart die Struktur erkennen lassen, damit du (das Prog) darauf zugreifen kannst. Die Struktur (dauerhaft) in einem Dict o.ä. zu speichern ist eine schlechte Idee - schließlich weißt du ja nicht, ob der Nutzer die DB zwischendurch nicht händisch (z.B. phpmyadmin bei MySQL) bearbeitet hat. Es gibt zwar für die meisten (alle?) relationalen DBs die entsprechenden Befehle, um alle Tabellen und deren Struktur auszulesen. Ist aber halt aufwendig.
Natürlich kannst du auch in einer relationalen DB diverse Tabellen anlegen, die untereinander keinerlei Beziehung haben. Da sind aber die weiter eben erwähnte dokumentenorientierten DBs oder KV-Stores wesentlich effizienter (weil dafür ausgelegt).

Kannst du vielleicht mal ein Beispiel geben, was den Prog überhaupt macht (machen soll) und was für Tabellen der Nutzer selber anlegen kann (soll / darf)?

Gruß, noisefloor
Antworten