DB frisst SQL, aber Python bringt Fehlermeldung

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
andi24
User
Beiträge: 56
Registriert: Freitag 5. März 2010, 11:42

Hallo zusammen,

ich möchte eine Query per Python an eine Postgres-DB schicken, was auch überall in meinem Programm problemlos funktioniert. Nur an einer Stelle bekomme ich die Meldung

Code: Alles auswählen

psycopg2.ProgrammingError: syntax error at or near "2011"
LINE X: ...gueltig_von <= 'E'2011-10-01...
Der Code:

Code: Alles auswählen

temp = datetime.strptime(datum,"%d.%m.%Y")
datum=temp.strftime("%Y-%m-%d")

sql="""SELECT * FROM kunde WHERE gueltig_bis > '%s' """

curs.execute(sql, datum)
rows = curs.fetchone
Vorher wird natürlich eine Connection aufgebaut und ein Cursor "curs" erzeugt, aber das spar ich mir jetzt mal, weil es darauf denke ich nicht ankommt.

Wenn ich die Variable sql ausgeben lasse und den Code in meinen pgAdmin kopiere, bekomme ich Datensätze angezeigt. Schicke ich den selben Code über Python an die DB, kommt die obige Fehlermeldung. Aufällig ist auch das 'E', das vor das Datum gesetzt wird. Aber lt. google ist das wohl normal so bei Postgres und sollte nicht das Problem sein.

Die Query sieht im Endeffekt dann so aus: SELECT * FROM kunde WHERE gueltig_bis > '2011-10-01'
Der Parameter (das Datum) ist vom Typ datetime. Hab es auch testweise schonmal in str konvertiert.

Weiß jemand, was ich hier machen könnte?

Vielen Dank für jeden Hinweis!

Andi
BlackJack

@andi24: Du könntest die ' um das %s wegnehmen.
andi24
User
Beiträge: 56
Registriert: Freitag 5. März 2010, 11:42

Ja, das hatte ich versucht. Dann gibt es zwar keinen Fehler, aber der Datensatz fällt mir durch. Im SQL-Manager wird er aber wie gesagt selektiert...
BlackJack

@andi24: In solchen Fällen kommt es manchmal auch darauf an welche „locale“ erwartet wird, also in welchem Format das Datum vorliegen muss. Als erstes würde ich in solchen Fällen schauen ob der Datenbankadapter mit tatsächlichen Datumsobjekten klar kommt, also zum Beispiel `datetime.date` oder `mx.DateTime`.
andi24
User
Beiträge: 56
Registriert: Freitag 5. März 2010, 11:42

Hallo BlackJack!

Danke für den Hinweis! Ich hab daraufhin einfach testweise einen String generiert:

datum='2011-10-01'

Aber auch hier ist es so:
- Wenn ich die Anführungszeichen bei '%s' setze, bekomme ich die obige Fehlermeldung
- Wenn ich sie nicht setze, wird kein Datensatz selektiert (obwohl lt. SQL-Manager einer da ist)

Komische Sache ...

Viele Grüße, Andi
deets

Die Anfuehrungszeichen sind bei parametrisiertem execute wie du es verwendest zu 100% falsch.

Und uebergib doch gleich das date/datetime Objekt, statt da selbst stringzuwandlen.
BlackJack

@andi24: Eine Zeichenkette ist halt kein Datum. Sie könnte eines darstellen, aber es gibt zig verschiedene Wege *wie* man ein Datum als Zeichenkette schreiben kann. Ob und welche Darstellung von der DB erkannt wird, hängt von der DB und dem Kontext der Verbindung ab. Statt herum zu raten hättest Du auch einfach mal in die Dokumentation schauen können: http://packages.python.org/psycopg2/usage.html

Dort findet sich mindestens ein Beispiel wie man ein Datum angibt. Und auch der Hinweis, dass sowohl `datetime`- als auch `mx.DateTime`-Objekte vom Datenbankadapter erkannt werden.
Antworten