Bequemer SQL-Datenbankzugriff

Code-Stücke können hier veröffentlicht werden.
Benutzeravatar
michael070380
User
Beiträge: 29
Registriert: Freitag 16. Mai 2003, 09:05
Wohnort: Pfaffenhofen

Bequemer SQL-Datenbankzugriff

Beitragvon michael070380 » Donnerstag 14. August 2003, 13:34

Hallo
nachdem der Datenbankzugriff in Python nicht so schön ist wie in Perl oder PHP, habe ich dafür eine eigene Funktion geschrieben. Mit dieser Funktion ist es möglich, dank Dictonary, auf die Werte der SQL-Abfrage mit dem Spaltenname und der ZeilenNr zuzugreifen.
Verbesserungsvorschläge erwünscht!

Gruß
Michael B.

Code: Alles auswählen

#!/usr/local/bin/python
import MySQLdb
import sys

# Datenbankeinstellungen
try:
   conn = MySQLdb.connect(host="127.0.0.1", user="root", passwd="", db="testdatenbank")
   cursor = conn.cursor()
except MySQLdb.Error, e:
   print "Datenbankfehler %d: %s" % (e.args[0], e.args[1])
   sys.exit(1)

#-------------------------------------------------------------------------------------
# SQL-Funktion
#-------------------------------------------------------------------------------------
def sql_query(sql, cursor):
   
   # Erstelle Dictonary
   ergebnis = {"<NULL>": ("")}
   
   # Führe Abfrage aus
   try:
      cursor.execute(sql)
      erg = cursor.fetchall()
      spalten = cursor.description
      
   except MySQLdb.Error, e:
      print "-> SQL-Fehler!", e
      return "", 0
   
   # Schreibe Ergebnis in Dictonary
   spaltenZaehler = -1
   for spalte in spalten:
      spaltenZaehler = spaltenZaehler + 1
      inhalt = []
      for i in range(0,len(erg)):
         tmp = erg[i][spaltenZaehler]
         inhalt.insert (i, tmp)
      
      ergebnis[spalte[0]] = inhalt
      
   del ergebnis["<NULL>"]   
   
   return ergebnis, len(erg)
   

# Hauptprogramm
erg, zeilenanzahl = sql_query ("select Adresse1, Strasse, AuftragNr from Auftrag limit 5", cursor)

for zeilenNr in range(0, zeilenanzahl):
   print erg["Adresse1"][zeilenNr] + " | " + erg["Strasse"][zeilenNr] + " | " + erg["AuftragNr"][zeilenNr]


#-------------------------------------------------------------------------------------
# Beispielausgabe
#-------------------------------------------------------------------------------------
# Firma1 | Musterstrasse  3 |
# Firma1 | Musterstrasse  3 | 000001
# Firma2 | Berliner Str. 12 | 100010
# Firma2 | Berliner Str. 12 | 100030
# Firma2 | Berliner Str. 12 | 100040


# Programmende   
conn.close()
sys.exit(0)

Zuletzt geändert von michael070380 am Donnerstag 14. August 2003, 14:53, insgesamt 1-mal geändert.
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Donnerstag 14. August 2003, 14:09

Hi michael,

wennst deinen Code jetzt noch in [code]..[/code] einschließt, ists sicher noch brauchbarer. ;)


Gruß

Dookie
XT@ngel
User
Beiträge: 256
Registriert: Dienstag 6. August 2002, 14:36
Kontaktdaten:

Beitragvon XT@ngel » Freitag 15. August 2003, 01:03

Geht aber auch einfacher *g*
Hatte nämlich auch keine lust mich da doll umzustellen :)

Code: Alles auswählen

import MySQLdb

#Verbindung zur Datenbank:
conn = MySQLdb.connect(host="localhost", db="BBS_1_8", user="root", passwd="")
#Erstelle Dict Cursor
c = conn.cursor(MySQLdb.cursors.DictCursor)


query = "SELECT * FROM bbs_authors"
c.execute(query)
result = c.fetchall()
#print result
for row in result:
   print `row` + "\n"



mfg
Andreas
Benutzeravatar
michael070380
User
Beiträge: 29
Registriert: Freitag 16. Mai 2003, 09:05
Wohnort: Pfaffenhofen

Beitragvon michael070380 » Freitag 15. August 2003, 17:55

Warum findet man sowas eigentlich in keinem Python-Buch (nicht einmal im Python Cookbook)? :?

Gruß
Michael B.
XT@ngel
User
Beiträge: 256
Registriert: Dienstag 6. August 2002, 14:36
Kontaktdaten:

Beitragvon XT@ngel » Dienstag 4. November 2003, 10:22

Hier die (angeblich) schnellere Version direkt über _mysql

Code: Alles auswählen

import _mysql     
conn = _mysql.connect(host      = self.database_host,
                                       user      = self.database_user,
                                       passwd = self.database_passwd,
                                       db         = self.database_name
                                       )
     
conn.query(query)
result = conn.store_result()
rows =  result.fetch_row(maxrows=0, how=1)


Mit maxrows wird festgelegt vieviel Datensätze zurückgegeben werden.
Bei maxrows=0 werden alle Datensätze zurückgeben. Der default Wert ist hier '1'.

Der Parameter how gibt an in welcher Form die Daten zurückgegeben werden.
Der default Wert ist hier how=0 und liefert das Ergebnis wie gewohnt als Tuple zurück.

how = 1 : Als dictionary in der Form Dict[spaltenname]
how = 2 : Als dictionary in der Form Dict[Tabelle.spaltenname]

Alternativ zu store_result() kann die Methode use_result()
verwendet werden.

Bei use_result() werden die Datensätze stück für stück vom Server geliefert und sollte verwendet werden wenn das Ergebnis extrem groß ist.

MfG
Andreas
Marvoloe
User
Beiträge: 16
Registriert: Donnerstag 4. November 2004, 20:00
Wohnort: Magdeburg, Sachsen-Anhalt
Kontaktdaten:

Beitragvon Marvoloe » Donnerstag 4. November 2004, 20:19

Hm...
*grübel*

Momentan bin ich dabei mit PHP eine MySql-Klasse zuschreiben, die es erlaubt mit simplen Funktionen, wie "getValue(tabelle, limits)" MySql Daten zu holen. Da würde es auch gehen mehrere Connetctions gelichzeitig offen zu haben (zu verschiedenen Datenbanken).

Genau da liegt meine Frage: Könnte ich auch via Python mehrere MySql Verbindungen nutzen? Wenn ja, gäbe es da auch eine Organisationsklasse für?

(Bin komplett neu... Habe noch nie was mit Python geschrieben... Habe es vor kurzem erst endeckt.)
"Für ein Schiff das seinen Hafen nicht kennt ist jeder Wind der Falsche."
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Donnerstag 4. November 2004, 22:27

Hi Marvoloe,

bei Python nutzt man meist die Standartisierte SQL-Schnittstelle, hat den Vorteil daß du ohne deinen Code zu ändern mit verschiedenen Datenbanken arbeiten kannst.
siehe: http://www.python.org/peps/pep-0249.html
MySQL ist durch seine bescheidene Unicodeunterstützung leider immer wieder ein quell der Frustration ;)


Gruß

Dookie

Code: Alles auswählen

#!/usr/bin/env python
import this
Marvoloe
User
Beiträge: 16
Registriert: Donnerstag 4. November 2004, 20:00
Wohnort: Magdeburg, Sachsen-Anhalt
Kontaktdaten:

Beitragvon Marvoloe » Freitag 5. November 2004, 16:49

Hmmm....
Hallo Dookie,

also ich nutze MySQL und habe noch nie eine Frustration deshalb gehabt... Was genau meinst du?
Welche Alternativen bietet Python? (Außer Access... Habe Linux!)
"Für ein Schiff das seinen Hafen nicht kennt ist jeder Wind der Falsche."
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Freitag 5. November 2004, 19:13

Du kannst auch Oracle oder Postgres verwenden mit Python. Sogar zu SAP gibt es Module. Ich selber hab meinen Recher (auch Linux) ganz auf utf-8 umgestellt, ausser MySQL, das müsste ich neu compilieren. Für neuere Projekte verwende ich Postgres.


Gruß

Dookie

Code: Alles auswählen

#!/usr/bin/env python
import this
Marvoloe
User
Beiträge: 16
Registriert: Donnerstag 4. November 2004, 20:00
Wohnort: Magdeburg, Sachsen-Anhalt
Kontaktdaten:

Beitragvon Marvoloe » Freitag 5. November 2004, 20:30

*grübel* Davon habe ich noch nie was gehört.
Oracle ist mir ein Begriff, jedoch ahbe ich keine Ahnung was sich hinter verbirgt....

Hier auf meinem Rechner habe ich Windows... Ic könnte doch die Python Programme auch erstmal offline schreiben... Und mit meinem Lokalen Testserver arbeiten, oder?
"Für ein Schiff das seinen Hafen nicht kennt ist jeder Wind der Falsche."
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Freitag 5. November 2004, 21:40

Jo du kannst sogar nen einfachen webserver in Python schreiben, bzw. den gibts schon als modul wird z.B. von pydoc benutzt um die Dokumentation zu Pythonmodulen in einem Webbrowser anzuzeigen. Vielleicht bekommst du ja noch das Linux Magazin Sonderheft 4/2004 "Scriptsprachen", da stehen recht informative Sachen zu vielen Scriptsprachen unteranderem auch PHP und Python drinn mit Beispielen.


Gruß

Dookie

Code: Alles auswählen

#!/usr/bin/env python
import this
Marvoloe
User
Beiträge: 16
Registriert: Donnerstag 4. November 2004, 20:00
Wohnort: Magdeburg, Sachsen-Anhalt
Kontaktdaten:

Beitragvon Marvoloe » Donnerstag 11. November 2004, 20:09

Was ist wenn das aber so aussieht:
http://www.mkana.com/python/mysql.py/hello

Was ist falsch? Ich versteh nur bahnhof, habe diesen Code genutzt:

Code: Alles auswählen

import MySQLdb

#Verbindung zur Datenbank:
conn = MySQLdb.connect(host="localhost", db="BBS_1_8", user="root", passwd="")
#Erstelle Dict Cursor
c = conn.cursor(MySQLdb.cursors.DictCursor)


query = "SELECT * FROM bbs_authors"
c.execute(query)
result = c.fetchall()
#print result
for row in result:
   print `row` + "\n"


HILFE!!!
"Für ein Schiff das seinen Hafen nicht kennt ist jeder Wind der Falsche."
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Donnerstag 11. November 2004, 20:54

Hi Marvoloe,

da scheint Dein provider beim installen von Python misst gebaut zu haben, schick ihm mal die Fehlermeldung. Bei der Gelegenheit kannst du ihn auch bitten auf eine aktuellere Pythonversion (2.3) upzudaten.


Gruß

Dookie

Code: Alles auswählen

#!/usr/bin/env python
import this

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder