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
Generische Datenbank API für Python
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo Jonas!veers hat geschrieben:Gibt es so etwas wie OLE DB?
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.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
- 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
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
was genau möchtest du?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.
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.
- veers
- User
- Beiträge: 1219
- Registriert: Mittwoch 28. Februar 2007, 20:01
- Wohnort: Zürich (CH)
- Kontaktdaten:
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.keppla hat geschrieben:was genau möchtest du?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.
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.
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Du musst ja auch nicht _alle_ module finden, sondern nur die, die der user braucht. Also mal als minimalistischer, verbesserungsbedürftiger Ansatz: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.
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()