mysql datenbankabfrage mit dictionary

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Ich versuche gerade eine mysql-abfrage zu starten und zwar sieht das ganze so aus:

Code: Alles auswählen

# benutzer id holen
def getBenutzerId ():
	config = ConfigParser.RawConfigParser()
	conf = os.environ['HOME'] + "/.mydb/mydb.cfg"
	config.read (conf)
	data = {
	"benutzer"		:	config.get('mydb', 'benutzer'),
	"passwort"		:	config.get('mydb', 'passwort')
	}
	conn = opendb ()
	cursor = conn.cursor()
	cursor.execute("""SELECT * FROM benutzer where benutzer = ':benutzer'""", data)
	benutzer_id = cursor.fetchall ()
	cursor.close ()
	return (benutzer_id)
Ich bekomme keine Fehlermeldung, also connecten funktioniert. Ich bekomme nur keinen Datensatz zurück, obwohl ich einen zurück bekommen müßte. Das komische daran ist, das der gleiche Syntax mit sqlite geht. Hat jemand ne Ahnung, wie das unter mysql gemacht wird? Ich habe so das Gefühl, das er in dem sql Syntax nicht die Variable benutzer nimmt, sondern eben das ganze Wort, denn dann ist auch klar, das ich keinen Datensatz zurück bekomme. Ich würde eben gerne nen Dictionary für meine Abfragen benutzen ( hatte mich jetzt von sqlite so dran gewöhnt ).
Kann mir da jemand schnell auf die Spünge helfen?
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

so, scheint es zu gehen ;)

Code: Alles auswählen

cursor.execute("""SELECT * FROM benutzer where benutzer = (%(benutzer)s)""", data)
Ich frage mich nur immer, wo man solche Infos schnell her bekommt. Da muß man ja super lange für googlen.
Zuletzt geändert von The Hit-Man am Dienstag 23. August 2011, 17:54, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Die DB-API 2.0 erwartet bei prepared statements aber doch ein Tupel! Ich bezweifel irgend wie, dass das mit SQLite gehen sollte. Zudem wird dort doch ein Parameter mit `?foo` Notation dargestellt, iirc?

Wenn Du nur ein Tupel als Ergebnis erwartest, solltest Du `cursor.fetchone()` nehmen. So wäre der Name auch verwirrend, da in `benutzer_id` kein einzelner Datensatz drin steht, sondern ein Iterable.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
noisefloor
User
Beiträge: 4149
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Hyperion hat geschrieben:Die DB-API 2.0 erwartet bei prepared statements aber doch ein Tupel!
Also AFAIK (und ich bin mir ziemlich sicher ;-) ) braucht man kein Tuple, wenn man nur ein Paramter hat.
Ich bezweifel irgend wie, dass das mit SQLite gehen sollte. Zudem wird dort doch ein Parameter mit `?foo` Notation dargestellt, iirc?
Vielleicht ist das Python-SQLite Modul da flexibler... MySQLdb ist da ziemlich unflexibel, weil nur die %s Notation geht.

@The Hit-Man: Warum nimmst du denn

Code: Alles auswählen

return (foo)
statt

Code: Alles auswählen

return foo
???

Außerdem vergisst du in deinem Beispiel, die Connection zu schließen. :-)

Gruß, noisefloor
BlackJack

@Hyperion: Die Parameter können auch eine Abbildung sein:
PEP 294 — Python Database API Specification v2.0 hat geschrieben:.execute(operation[,parameters])

Prepare and execute a database operation (query or
command). Parameters may be provided as sequence or
mapping and will be bound to variables in the operation.
Variables are specified in a database-specific notation
(see the module's paramstyle attribute for details). [5]
Macht ja auch irgendwie Sinn wenn es die Möglichkeit gibt benannte Platzhalter zu verwenden.

@The Hit-Man: Ich würde ja SQLAlchemy für die Datenbankanbindung verwenden. Dann muss man sich nicht so mit den Unterschieden in SQL-Dialekten und Datenbankmodulen herum schlagen.
Benutzeravatar
noisefloor
User
Beiträge: 4149
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Ich würde ja SQLAlchemy für die Datenbankanbindung verwenden. Dann muss man sich nicht so mit den Unterschieden in SQL-Dialekten und Datenbankmodulen herum schlagen.
+1

Gruß, noisefloor
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@BlackJack: Ah, danke. Zu lange her, dass ich mal direkt gegen das API programmiert habe :-)

Daher auch +1 für einen ORM. (Ich würde da ja zu Elixir raten ;-) )
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Hyperion: Ich meinte SA nicht einmal unbedingt als ORM. Auch normales SQL lässt sich damit schön abbilden. Wobei ORM natürlich auch schick ist.
Antworten