DB-API

Die Python DB-API

Mit PEP-0249, der Python Database API Specification v2.0, kurz DB-API, wird eine allgemeine Schnittstelle zu relationalen Datenbanken beschrieben.

Fast alle Datenbankmodule halten sich an diese API und können somit gleich angesprochen werden.

Da das SQL-Quoting oft falsch gemacht wird, bitte den Artikel Parametrisierte SQL-Queries beachten, um SQL-Injections zu vermeiden!

Datenbanksprache

Ganz unabhängig davon sieht die eigentlichen Datenbanksprache, SQL, ganz unterschiedlich aus. Es existieren zwar theoretisch verschiedene SQL-Sprachstandards, die eine unabhängige Programmierung der verschiedenen Datenbanken ermöglichen sollten, in der Praxis muss man allerdings doch gezielt auf die Unterschiede zwischen den verwendeten Datenbanken eingehen. Mehr dazu in der Wikipedia.

Unabhängig durch ORM

Um auch unabhängig von den unterschiedlichen SQL-Sprachstandards zu sein, kann man einen sog. Object Relational Mapper, kurz ORM, nutzen. Ein weiterer Vorteil liegt darin, dass man objektorientiert auf die Daten in der relationalen Datenbank zugreift. Eine der neuesten Entwicklungen in dieser Richtung ist SQLAlchemy.

doch nicht ganz unabhängig

Allerdings ist man auch mit einem ORM nicht in allen Bereichen DB-unabhängig.

Spätestens, wenn man zu einem späteren Entwicklungszeitpunkt die bestehende Datenbank ein wenig ändern will, hat man ein Problem. Alle verfügbaren ORM-Implementierungen haben keine Methoden, um Tabellen im nachhinein zu ändern. Je nach genutzter Datenbankengine hat man überhaupt keine Möglichkeit eine Tabelle anzupassen, z.B. kann ALTER TABLE bei SQLite nur Tabellen umbenennen oder neue Spalten hinzufügen. Bei MySQL kann man mit ALTER TABLE sehr umfangreich die Spalten im nachhinein ändern lassen.

Ebenfalls nicht abgedeckt vom ORM ist das Sichern und Einspielen der Daten, da dies mit SQL nichts zu tun hat. Bei den meisten Engines gibt es die Möglichkeiten, einen sog. Dump der Daten in Dateiformat zu erhalten, der als Sicherung verwendet werden kann, bei dateibasierten Engines wie SQLite ist das gar nicht erforderlich.

DB-API Beispiel

Hier ein kurzes Beispiel, wie die Kommunikation mit der DB-API aussehen kann:

   1 import sqlite3 as dbapi
   2 
   3 # Verbindung aufbauen -- :memory: ist eine temporäre DB im Speicher
   4 conn = dbapi.connect(":memory:")
   5 
   6 # Einen Cursor 'erstellen':
   7 cursor = conn.cursor()
   8 
   9 # SQL Befehl absetzten:
  10 cursor.execute("CREATE TABLE ...")
  11 
  12 # Eigene Sicht der Daten dauerhaft speichern:
  13 cursor.commit()
  14 
  15 # SQL-Quoting nutzen:
  16 cursor.execute("SELECT foo FROM bar WHERE foobar=%s", (23,))
  17 
  18 # Alle Ergebnisse anzeigen:
  19 print cursor.fetchall()
  20 
  21 # Transaktion Beispiel:
  22 cursor = conn.cursor()
  23 try:
  24     cursor.execute("INSERT...")
  25     cursor.execute("DELETE...")
  26     ...
  27     cursor.execute("...")
  28 except:
  29     db.rollback()
  30 else:
  31     db.commit()

Tags: Db

DB-API (last edited 2009-06-17 16:14:26 by localhost)