SQL-Abfrage mit Python starten

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
AVFuchs
User
Beiträge: 18
Registriert: Freitag 1. Oktober 2010, 14:01

Hallo erstmal an alle ich bin der neue und komme jetzt öfters. :)
Ich arbeite nun schon seit kurzem mit Python beruflich und bin immer wieder unausweichlich auf diese Seite gestoßen wenn ich Probleme mit Python hatte, vorallem spezielle und jetzt glaube ich, das ich langsam an einem Punkt angkommen bin wo mir nur noch dieses Forum, in der Zunkunft, helfen kann. :)

Erstmal hoffe ich das richtig gesucht habe und es nicht zu einem Doppelpost kommt für mein Problem.

Also mein Problem besteht darin das ich mir schon die Grundlagen mit Python angeeignet habe, vielleicht auch schon erweiterte Grundlagen, und nun soll ich eine Datenbankabfrage mit Python über SQL machen und das am besten und noch einem LaTeX Dokument(PDF) ausgeben lassen. Da meinte mein Chef nur: "Da gibt es so eine Bibliothek 'Pysql' mit der kannst du SQL einfach in Python einbinden". Daraufhin dachte ich mir dann braucht man ja nur "import pysql" und dann die sql befehle, aber so einfach ist es wohl nicht. Ich habe im Forum auch schon was von Zone und Plone Python gelesen aber das ist, wenn ich es richtig verstanden habe, für die Datenbank Erstellung aber das brauche ich ja nicht.

Zu meiner Frage: Wie binde ich SQL nun richtig in Python ein und brauche ich dann nur die SQL Befehle wie z.B. WHERE * FROM blabla oder brauche ich da dann eine abgewandelte Form der Befehle für Python??

Danke schon mal.

Viel Grüße vom Fuchs

PS: mit SQL kenn ich mich gar nicht weiter aus
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Willkommen bei uns,

Es gibt Anbindungen für SQL-Datenbanken für Python, die müssen allerdings erst installiert werden, z.B.: pyMsSql, psycopg2, MySQLdb, SQLite (muss nicht installiert werden). Mit diesen Modulen kannst du dann erst mit Datenbanken arbeiten, erstellen, löschen oder Queries nutzen.

PS: es gibt nen Edit-Button
the more they change the more they stay the same
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

AVFuchs hat geschrieben:PS: mit SQL kenn ich mich gar nicht weiter aus
Da ist das Problem. SQL-Befehle sind nicht mehr als Strings.[1]

Alles was du daneben noch brauchst ist eine Datenbankanbindung, die ist aber abhaengig von der verwendeten Datenbank. Im Falle von SQLite3 ist der Treiber aber schon in der Standardbibliothek: http://docs.python.org/library/sqlite3.html

[1] Ja man kann auch SQLAlchemy nutzen, aber das geht evtl etwas zu weit.
AVFuchs
User
Beiträge: 18
Registriert: Freitag 1. Oktober 2010, 14:01

Danke für die schnellen Antworten.

Also wäre SQLite für mein Problem am besten geeignet. Ok dann werde ich mal dazu belesen und kucken wie ich mich da einarbeite. Mit Datenbankanbindung meinst du bestimmt den Pfad zur Datenbank oder? Das wäre ich ja auch ein Problem. Ich kann ja bestimmt nicht so einfach wie beim Open Befehl einfach den Dateipfad eingeben und es auslesen lassen...
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

AVFuchs hat geschrieben:Also wäre SQLite für mein Problem am besten geeignet.
Das hat niemand gesagt. Was sind denn die Anforderungen? Wenn es um eine lokale Datenbank und keinen Server geht, dann ist SQLite aber auf jeden Fall geeignet.
AVFuchs hat geschrieben:Mit Datenbankanbindung meinst du bestimmt den Pfad zur Datenbank oder?
Nein, eben die Treiber wie sqlite3 oder wie Dav1d sie genannt hat. Anbindungen wie du es meinst sind abhaengig vom jeweiligen Treiber.
Mit sqlite ist es allerdings genau so einfach wie `open` zu nutzen.
AVFuchs
User
Beiträge: 18
Registriert: Freitag 1. Oktober 2010, 14:01

Ok. Also am Anfang dachte ich um in die Materie reinzukommen lokal zu experimentieren aber später soll die Abfrage dann von einem richtigen Daten-Server laufen. Die Abfrage soll dann von einem Linux-Server starten, auf einem Daten-Server ausgelesen werden und bei jedem beliebigen Client ausgegeben werden können per Programm oder Explorer.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Neuer Versuch: Was sind die Anforderungen?
AVFuchs
User
Beiträge: 18
Registriert: Freitag 1. Oktober 2010, 14:01

Hhmm ich hoffe ich beantworte es jetzt richtig. Mit SQL sollen Produktionsdaten ausgelesen werden und in einem PDF ausgegeben werden und das alles soll von Python gesteuert werden, so das Betriebs- und Programmunabhängig funktioniert.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nein, das "Was" ist irrelevant. Wichtig ist das "Wie".

SQLite scheidet aus, wenn man mehrere schreibende, gleichzeitige Verbindungen hat oder direkte Netzwerkunterstuetzung.

D.h. relevant ist: Wie kommen die Daten in die Datenbank, wie wird sie ausgelesen und von welchen Groessenordnungen reden wir.

Warum das wichtig ist: Es ist nicht sinnvoll mit einem DBMS zu testen und dann mit einem anderen in die Produktion zu gehen.
Benutzeravatar
noisefloor
User
Beiträge: 4149
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wichtig ist auch: WIE wird in die DB geschrieben? Sollen irgendwelche Steuerungen von Maschinen die Daten direkt in die DB schreiben? Wenn ja spielt das bei der Auswahl die verfügbaren Treiber / Schnittstellen eine Rolle. Ggf. musst du z.B. eine DB mit ODBC-Anbindung nehmen...

Zur anderen Frage (PDF): Wenn das alleinige Ziel die Ausgabe eines PDFs ist, dann brauchst du den Umweg über LaTeX nicht. Eine reine pythonische Lösung, welche recht populär ist, istReportLab.

Gruß, noisefloor
AVFuchs
User
Beiträge: 18
Registriert: Freitag 1. Oktober 2010, 14:01

Hallo wieder.
Sorry aber übers Wochenende hab ich normalerweise kein Internet.
Ok mit solchen Ausmaßen hätt ich nicht gerechnet. Mit Datenbanken kenn ich auch nicht weiter aus. Die Datenbanken kommen direkt aus der Produktion und werden auf die Datenbank geschrieben, aber in welchem Format keine Ahnung, so weit ich das richtig verstanden habe werden diese einfach immer nur in bestimmten Clustern gespeichert. Ach und ja die Datenbank hat eine ODBC Anbindung.
Naja die Größenordnung, die Datenbank an sich beträgt mehere Terrabyte aber wie oft welche Maschine auf die Datenbank schreibt kann ich nicht sagen.
Benutzeravatar
noisefloor
User
Beiträge: 4149
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ach so, die DB existiert schon. Na dann... Ein Problem gelöst.

Zum ansprechen der DB kannst du dann das ODBC-Modul nehmen. Das funktioniert unter Python 2.x gut. Und entspricht der Python DB API 2.0.

Zum Auslesen der Daten brauchst du aber nach wie vor SQL. Und du musst natürlich wissen, wie die Daten gespeichert werden, also wie die DB und die Tabellen ausgebaut sind. Sonst bekommst du ja keinen sinnvollen SQL-Query zu Stande.

Gruß, noisefloor
AVFuchs
User
Beiträge: 18
Registriert: Freitag 1. Oktober 2010, 14:01

Achso das war ein Problem!?!?! Ich dachte das wäre klar gewesen. :mrgreen: Tschuldigung.
Naja wie die Datenbank aufgebaut ist, weiß ich jetzt noch nicht so genau. Ich hab noch nicht mal Zugangsberechtigung dazu (muss erst noch approved werden... -.-). Aber jedenfalls kann ich mit API 2.0 SQL in Python einbinden oder wie?
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

AVFuchs hat geschrieben:Achso das war ein Problem!?!?! Ich dachte das wäre klar gewesen. :mrgreen: Tschuldigung.
Naja wie die Datenbank aufgebaut ist, weiß ich jetzt noch nicht so genau. Ich hab noch nicht mal Zugangsberechtigung dazu (muss erst noch approved werden... -.-). Aber jedenfalls kann ich mit API 2.0 SQL in Python einbinden oder wie?
Die Frage ist, welche Datenbank dort eingesetzt wird. SQL ist zwar grundsätzlich eine genormte Sprache, aber wie diese zur Datenbank transportiert wird und wie diese die Ergebnisse zurückliefert ist höchst individuell. Dafür gibt es jetzt individuelle Module für jede Datenbank die aber typischerweise alle die Python DB API 2.0 unterstützen, so dass das Handling aus einem Python-Programm heraus immer sehr ähnlich ist.

Um es noch mal ganz deutlich zu machen: Module wie pyMsSql, psycopg2 und MySQLdb sind keine frei wählbaren datenbankunabhängigen Alternativen, sondern sind jeweils auf eine spezielle Datenbank abgestimmt.

Wenn du uns sagst, um welches RDBMS es sich handelt, dann können wir die eine Empfehlung für den passenden Treiber geben.
AVFuchs
User
Beiträge: 18
Registriert: Freitag 1. Oktober 2010, 14:01

Also hab gerade gefragt und der RDBMS der verwendet wird ist wohl PostSQL 3.8 oder 4 oder manchmal auch beide.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

AVFuchs hat geschrieben:Also hab gerade gefragt und der RDBMS der verwendet wird ist wohl PostSQL 3.8 oder 4 oder manchmal auch beide.
Doch eine so neue Version... :twisted:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
AVFuchs
User
Beiträge: 18
Registriert: Freitag 1. Oktober 2010, 14:01

Das klingt "fast" schon ironisch...
Wieso was ist denn mit der Version, kenn mich damit nicht weiter aus.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

AVFuchs hat geschrieben:Also hab gerade gefragt und der RDBMS der verwendet wird ist wohl PostSQL 3.8 oder 4 oder manchmal auch beide.
Das ist nun alles andere als präzise. Mit "Post SQL" könnte eine namentlich nicht näher spezifizierte Datenbank gemeint sein, die eben nicht unbedingt SQL spricht und anders organisiert ist. Andererseits könnte auch "PostgreSQL" gemeint sein. Dazu würde aber nun wiederum die Versionsangabe nicht passen, da PostgreSQL unter diesem Namen zum ersten Mal in Version 6.0 veröffentlicht wurde.

Ich halte es ja für ein wenig gewagt jemanden ohne Datenbankerfahrung auf so eine Aufgabe loszulassen.
AVFuchs
User
Beiträge: 18
Registriert: Freitag 1. Oktober 2010, 14:01

Ich halte es ja für ein wenig gewagt jemanden ohne Datenbankerfahrung auf so eine Aufgabe loszulassen.
Tja was soll ich dazu sagen. Es ist meine Aufgabe und die will ich so schnell und so gut wie möglich erledigen. Meine Theorie bestand ja auch darin, ich weiß wie man Dateien öffnet also öffne ich nur die Datei mit den SQL Befehlen, lasse die SQL die Daten von der Datenbank auslesen und speichere die Daten dann wieder mit Python. Ich dachte dazu reicht einfach der Verzeichnis und den Namen der Datenbank zu wissen und die Bibliothek mit der ich SQL in Python einbinde. Aber irgendwie beschleicht mich langsam das Gefühl das es so einfach nicht wird.

Und mit dem RDBMS kann ich nur sagen, was mein Chef mir gesagt hat vielleicht meinte er auch PostgreSQL und es ging nur sprachlich unter.

Edit:
Kann es sein das es so eine Version unter Linux gibt?
AVFuchs
User
Beiträge: 18
Registriert: Freitag 1. Oktober 2010, 14:01

Code: Alles auswählen

con = pymssql.connect(host=''hostname,user='name',password='kennwort',database='dbname')
cur = con.cursor()
query="select id,datum from tabelle where datum>=\'" + von + "\' and ts_insert<=\'" + bis + "\'"
cur.execute(query)
for row in cur.fetchall():
  id = row[0]
  datum = row[1]
  print Id + " vom " + str(datum.day) + "." + str(datum.month) + "." + str(datum.year) + " um " + str(datum.hour) + ":" + str(datum.minute) + ":" + str(datum.second)
con.commit()
con.close()
Diesen Code habe ich hier auf dieser Seite gefunden. So einfach hatte ich mir das zumindestens theoretisch vorgestellt. Oder bringt mir so was gar nix?
Antworten