Bequemer SQL-Datenbankzugriff

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

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.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi michael,

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


Gruß

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

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
michael070380
User
Beiträge: 29
Registriert: Freitag 16. Mai 2003, 09:05
Wohnort: Pfaffenhofen

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

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

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:

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.)
[quote]"Für ein Schiff das seinen Hafen nicht kennt ist jeder Wind der Falsche."[/quote]
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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]#!/usr/bin/env python
import this[/code]
Marvoloe
User
Beiträge: 16
Registriert: Donnerstag 4. November 2004, 20:00
Wohnort: Magdeburg, Sachsen-Anhalt
Kontaktdaten:

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!)
[quote]"Für ein Schiff das seinen Hafen nicht kennt ist jeder Wind der Falsche."[/quote]
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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]#!/usr/bin/env python
import this[/code]
Marvoloe
User
Beiträge: 16
Registriert: Donnerstag 4. November 2004, 20:00
Wohnort: Magdeburg, Sachsen-Anhalt
Kontaktdaten:

*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?
[quote]"Für ein Schiff das seinen Hafen nicht kennt ist jeder Wind der Falsche."[/quote]
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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]#!/usr/bin/env python
import this[/code]
Marvoloe
User
Beiträge: 16
Registriert: Donnerstag 4. November 2004, 20:00
Wohnort: Magdeburg, Sachsen-Anhalt
Kontaktdaten:

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!!!
[quote]"Für ein Schiff das seinen Hafen nicht kennt ist jeder Wind der Falsche."[/quote]
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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]#!/usr/bin/env python
import this[/code]
Antworten