2016-10-04 2 views
1

Ich benutze psycopg2 für Postgresql. Hier ist mein Code-Schnipsel:postgresql Zeitstempel Fehler mit Python einfügen

a = "INSERT INTO tweets (Time) VALUES (%s);" % (datetime.now(),) 

cursor.execute(a) 

das wird nicht funktionieren und gibt mir eine Fehlermeldung:

ProgrammingError: syntax error at or near "20" 
LINE 1: INSERT INTO tweets (Time) VALUES (2016-10-03 20:14:49.065092... 

Allerdings, wenn ich auf diese Weise ausgeführt wird:

cursor.execute("INSERT INTO tweets (Time) VALUES (%s);", (datetime.now(),)) 

es funktioniert. Ich möchte wissen, was der Unterschied zwischen diesen beiden Ausdrücken ist und was mit dem ersten falsch ist. Kann ich diese Funktion verwenden, die erste Struktur verwenden?

+0

Die erste verwendet Python String-Ersetzung. Die zweite verwendet Psycopg-Parameterübergabe und ist die einzige, die empfohlen wird. –

Antwort

3

Wenn Sie die erste Abfrage überprüfen, gibt es INSERT INTO tweets (Time) VALUES (2016-10-03 20:14:49.065092..., das heißt, es versucht, nicht notierten Wert als Zeit zu verwenden, und dies wird nicht funktionieren.

Wenn Sie wirklich Ihre erste Ansatz verwenden möchten, müssen Sie den Wert zitieren:

a = "INSERT INTO tweets (Time) VALUES ('%s');" % (datetime.now(),) 
cursor.execute(a) 

Ich würde Ihnen vorschlagen, den zweiten Ansatz zu verwenden, in dem Client-Bibliothek alle Zitate behandelt und in der Regel eine Menge verhindert von möglichen Problemen wie SQL-Injektion.

+0

Nicht einmal vorschlagen, den ersten Ansatz zu verwenden – piro

Verwandte Themen