Generische Datenbank API für Python

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Ich würde den Benutzern meiner Software gerne die Möglichkeit geben Daten aus einer "beliebigen" Datenbank zu importieren. Dazu soll der Typ der Datenbank, ein Connection String sowie eine SQL Abfrage angegeben werden. Wie realisiere ich so etwas ich Python? Gibt es so etwas wie OLE DB?

Gruss,
Jonas
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

veers hat geschrieben:Gibt es so etwas wie OLE DB?
Hallo Jonas!

Unter Windows kannst du direkt auf ADO zugreifen. Das ist allerdings nicht mit der Python DB-API kompatibel.

http://www.markcarter.me.uk/computing/python/ado.html

Dann gibt es noch ODBC, mit dem zu unter Windows recht gute DB-API kompatible Datenbankverbindungen zu ODBC-Datenquellen aufbauen kannst. Das in pywin32 eingebaute ODBC schwächelt gerne mal. Deshalb verwende ich pyODBC.

http://pyodbc.sourceforge.net/

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Das Problem dabei ist nur das ich das ganze Crossplatform sein soll. Was wohl eine Möglichkeit wäre ist ein Modul zu schreiben welches Python DB API konforme Module einheitlich anspricht. Es wunders mich nur dass das noch keiner gemacht hat.
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

veers hat geschrieben:Das Problem dabei ist nur das ich das ganze Crossplatform sein soll. Was wohl eine Möglichkeit wäre ist ein Modul zu schreiben welches Python DB API konforme Module einheitlich anspricht. Es wunders mich nur dass das noch keiner gemacht hat.
was genau möchtest du?
darf der sql-string datenbankspezifisch sein (also z.B. "select * from (select * from x) as x", was mysql3 nicht kann)?
Wenn ja, kann das die db-api imho.

Wenn nein brauchst du eine SQL-Abstraktion. Die bietet z.B. sqlalchemy, allerdings bietet es die nicht als sql-statement, was in den jeweiligen dialekt übersetzt wird, sondern "in python", á la frameworks, wie man sie aus den rails-lookalikes kennt.
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

keppla hat geschrieben:
veers hat geschrieben:Das Problem dabei ist nur das ich das ganze Crossplatform sein soll. Was wohl eine Möglichkeit wäre ist ein Modul zu schreiben welches Python DB API konforme Module einheitlich anspricht. Es wunders mich nur dass das noch keiner gemacht hat.
was genau möchtest du?
darf der sql-string datenbankspezifisch sein (also z.B. "select * from (select * from x) as x", was mysql3 nicht kann)?
Wenn ja, kann das die db-api imho.
Ja klar, das Statement wird vom User mitgeliefert. Das Problem an der DB API ist einfach das ich keinen Weg habe automatisch alle installierten Module zu finden.
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

veers hat geschrieben:Ja klar, das Statement wird vom User mitgeliefert. Das Problem an der DB API ist einfach das ich keinen Weg habe automatisch alle installierten Module zu finden.
Du musst ja auch nicht _alle_ module finden, sondern nur die, die der user braucht. Also mal als minimalistischer, verbesserungsbedürftiger Ansatz:

Code: Alles auswählen

def get_import_resultset(modulename, connectargs, query):
  mod = __import__(modulename)
  conn = mod.connect(**connectargs)
  cursor = conn.cursor()
  cursor.execute(query)
  return cursor.fetchall()
Der user muss nur das Datenbankmodul, die Verbindungsargumente und den Query angeben, all das kann aus einer Ini-Datei kommen
Antworten