WHERE-Bedingung mit Variable

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Seires
User
Beiträge: 12
Registriert: Samstag 18. August 2012, 08:33

Hey,

ich habe eine WHERE Bedingung, die sich je nach Auswahl des Users in einem Dropdownfeld ändern soll. Scheitere momentan aber daran, die WHERE-Bedingung mit einer Variable zu übergeben.

So sieht mein Code aus ('datum' ist die Spalte, 'userdatum' der vom Nutzer ausgewählte Wert:

Code: Alles auswählen

cursor.execute("SELECT * FROM eintraege WHERE  datum=%s),userdatum
Bekomme als Fehlermeldung:

Code: Alles auswählen

sqlite3.OperationalError: near "%": syntax error
Kann mir jemand helfen, wie es richtig geht?

Vielen Dank schonmal für jede Hilfe :)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hast Du Dir mal die Doku zu `execute` angeguckt? Vermutlich nicht, denn dort steht es genau und sogar mit Beispielen ;-) Also, schau in der Doku unter `Cursor.execute` nach.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Seires hat geschrieben:

Code: Alles auswählen

cursor.execute("SELECT * FROM eintraege WHERE  datum=%s),userdatum
Gut, dass es nicht funktioniert hat. Das manuelle Zusammenbauen eines SQL-Strings mit %s ist potenziell böse. Verwende ? wie in der sqlite3-Dokumentation vorgeschlagen und achte darauf, wo du deine Klammern und Anführungszeichen setzt.
Seires
User
Beiträge: 12
Registriert: Samstag 18. August 2012, 08:33

Habe es jetzt gelöst mit

Code: Alles auswählen

cursor.execute("SELECT * FROM eintraege WHERE  datum=?", ('%'+userdatum+'%',))
So müsste es sicher sein und funktioniert auch noch ;) Danke für die Hilfe!
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Was genau bezweckst du mit den Prozentzeichen?
Das Leben ist wie ein Tennisball.
Seires
User
Beiträge: 12
Registriert: Samstag 18. August 2012, 08:33

Das ist ne gute Frage :D
Hatte es von http://stackoverflow.com/questions/4409 ... -wildcards, habe es aber inzwischen auch umgewandelt in

Code: Alles auswählen

        cursor.execute("SELECT * FROM eintraege WHERE  datum=?", (userdatum,))
Nur das Komma nach "userdatum" ist wichtig, sonst will er jedes Zeichen als einzelnen Wert übergeben und nicht als gemeinsamen String...
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Seires hat geschrieben:Nur das Komma nach "userdatum" ist wichtig, sonst will er jedes Zeichen als einzelnen Wert übergeben und nicht als gemeinsamen String...
Naja, execute erwartet eben etwas iterierbares, was auf einen String recht gut passt. Mittels eines Tupels kannst du daher so beliebig viele Werte in deinem Ausdruck ersetzen lassen.
Das Leben ist wie ein Tennisball.
bfm
User
Beiträge: 88
Registriert: Donnerstag 14. März 2013, 09:42

Hallo zusammen,

an dem kleinen Komma bin ich auch gescheitert. Ich glaube, das werde ich nie wieder vergessen! :lol:

mfg
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

bfm hat geschrieben:an dem kleinen Komma bin ich auch gescheitert. Ich glaube, das werde ich nie wieder vergessen! :lol:
Man muss sich halt klar machen, welcher Datentyp erwartet wird und welchen man übergibt.

Code: Alles auswählen

>>> print type(('foo'))
<type 'str'>
>>> print type(('foo',))
<type 'tuple'>
>>> for element in ('foo'):
	print element
	
f
o
o
>>> for element in ('foo',):
	print element
	
foo
Antworten