psycopg2 TypeError: nicht alle Argumente konvertiert werden, während der string-Formatierung
Ich versuche, führen Sie eine einfache Abfrage, aber immer diese Fehlermeldung, egal wie ich die übergabe der Parameter.
Hier ist die Abfrage (ich bin mit Trac-db-Objekt eine Verbindung zu einer DB):
cursor.execute("""SELECT name FROM "%s".customer WHERE firm_id='%s'""" % (schema, each['id']))
schema und jede['id'] beides sind einfache strings
print("""SELECT name FROM "%s".customer WHERE firm_id='%s'""" % (schema, each['id']))
Ergebnis:
SELECT name FROM "Planing".customer WHERE firm_id='135'
Es ist auf Fehler entfernen Preisangebot nach firm_id=
, aber so ist parameter behandelt wird, eine Ganzzahl und ::text
führt zu die gleiche Fehlermeldung.
Könntest du den Ausgang des
Ich aktualisiert meine Frage mit der Ausgabe führen
print("""SELECT name FROM "%s".customer WHERE firm_id='%s'""" % (schema, each['id']))
?Ich aktualisiert meine Frage mit der Ausgabe führen
InformationsquelleAutor konart | 2014-02-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie nicht verwenden die string-interpolation für die übergabe von Variablen in Datenbank-Abfragen, aber mit string-interpolation um die Tabelle-name ist in Ordnung (solange es nicht entweder eine externe Eingabe oder Schränken Sie die zulässigen Wertes). Versuchen:
Regeln für DB-API-Nutzung sollte Pflichtlektüre sein, bevor die Programmierung mit der Datenbank.
InformationsquelleAutor RjOllos
Bekam ich die gleiche Fehlermeldung und konnte nicht für das Leben von mir herauszufinden, wie zu lösen, am Ende war es mein dummer Fehler, weil ich nicht genügend Parameter matching die Anzahl der Elemente im Tupel:
Hinweis, dass ich 5 Elemente werden die Werte in die Tabelle eingefügt, aber-6-Tupel.
InformationsquelleAutor rsacc
In meinem Fall konnte ich noch nicht erkennen, dass Sie zu bestehen hatte eine tuple-to-cursor.ausführen. Ich hatte diese:
Aber ich brauchte, um pass ein Tupel anstatt
InformationsquelleAutor Spencer Sutton
Den richtigen Weg zur übergabe von Variablen in einem SQL-Befehl ist mit dem zweiten argument der
execute()
Methode. Und ich denke, Sie sollten entfernen Sie einzelne Zitate aus zweiter parameter, Lesen Sie über es hier - http://initd.org/psycopg/docs/usage.html#the-problem-with-the-query-parameters.Beachten Sie, dass Sie cant pass Tabellennamen als parameter
execute
und es gilt als schlechte Praxis, aber es gibt einige workarounds:Vorbei Tabellenname als ein parameter in psycopg2
psycopg2 cursor.execute() mit der SQL-Abfrage-parameter bewirkt, dass syntax-Fehler
Übergeben Tabellennamen versuchen Sie dies:
LINE 1: SELECT name FROM "'Planing'".customer WHERE firm_id='135'
-- gibt es eine Möglichkeit zum löschen von einzelnen Anführungszeichen in der Nähe vonPlaning
?Wie unterscheidet es sich von meinem
print("""SELECT name FROM "%s".customer WHERE firm_id='%s'""" % (schema, each['id']))
? Das wird funktionieren, aber ist es nicht der falsche Weg, wie Sie vorhin gesagt?Danke, ich habe gelesen, durch den link vor. Das größte problem für mich hier ist, dass der schema-Namen ändern könnte, so hardcoding ist es nicht die beste option entweder, und gleichzeitig die richtige Art und Weise ist sichergestellt, dass die strings die ich übergeben, als eine Tabelle der Werte mit Escapezeichen versehen werden. Ich denke, ich werde haben, zu bleiben, um hardcoding es für jetzt.
InformationsquelleAutor ndpu
Verwenden
AsIs
InformationsquelleAutor Clodoaldo Neto
Sollten Sie nicht verwenden die string-interpolation für die übergabe von Variablen in Datenbank-Abfragen, aber mit string-interpolation um die Tabelle-name ist in Ordnung (solange es nicht entweder eine externe Eingabe oder Schränken Sie die zulässigen Wertes). Versuchen:
Regeln für DB-API-Nutzung sollte Pflichtlektüre sein, bevor die Programmierung mit der Datenbank.
In meinem Fall konnte ich noch nicht erkennen, dass Sie zu bestehen hatte eine tuple-to-cursor.ausführen. Ich hatte diese:
Aber ich brauchte, um pass ein Tupel anstatt
Bekam ich die gleiche Fehlermeldung und konnte nicht für das Leben von mir herauszufinden, wie zu lösen, am Ende war es mein dummer Fehler, weil ich nicht genügend Parameter matching die Anzahl der Elemente im Tupel:
Hinweis, dass ich 5 Elemente werden die Werte in die Tabelle eingefügt, aber-6-Tupel.
Den richtigen Weg zur übergabe von Variablen in einem SQL-Befehl ist mit dem zweiten argument der
execute()
Methode. Und ich denke, Sie sollten entfernen Sie einzelne Zitate aus zweiter parameter, Lesen Sie über es hier - http://initd.org/psycopg/docs/usage.html#the-problem-with-the-query-parameters.Beachten Sie, dass Sie cant pass Tabellennamen als parameter
execute
und es gilt als schlechte Praxis, aber es gibt einige workarounds:Vorbei Tabellenname als ein parameter in psycopg2
psycopg2 cursor.execute() mit der SQL-Abfrage-parameter bewirkt, dass syntax-Fehler
Übergeben Tabellennamen versuchen Sie dies:
LINE 1: SELECT name FROM "'Planing'".customer WHERE firm_id='135'
-- gibt es eine Möglichkeit zum löschen von einzelnen Anführungszeichen in der Nähe vonPlaning
?print("""SELECT name FROM "%s".customer WHERE firm_id='%s'""" % (schema, each['id']))
? Das wird funktionieren, aber ist es nicht der falsche Weg, wie Sie vorhin gesagt?Verwenden
AsIs