2016-10-05 3 views
0

Ich versuche, psycopg2 zu verwenden, um eine Zeile in eine Tabelle aus einer Python-Liste einzufügen, aber Probleme mit der Formatierung von Zeichenfolgen.psycopg2 nicht alle Argumente während der Formatierung von Zeichenfolgen konvertiert

Die Tabelle hat 4 Spalten von Typen (1043-varchar, 1114-timestamp, 1043-varchar, 23-int4). Ich habe auch Versuche mit 1082-Datum anstelle von Zeitstempel und 21-Int2 statt Int4 gemacht.

Die folgende Anweisung funktioniert in pgAdmin oder durch einen psycopg2 Cursor Ausführung ohne String-Formatierung:

INSERT INTO ssurgo.distmd VALUES ('5', '2015-01-01', 'Successful', 4891); 

Allerdings, wenn ich tun:

sql_text = "INSERT INTO ssurgo.distmd VALUES %s ;" 
data = ['5', '2015-01-01', 'Successful', 4891] 
data[1] = date.today() # ensure psycopg2 recognizes a date using datetime 
print(curs.mogrify(sql_text, data)) 

ich:

TypeError: not all arguments converted during string formatting 

Ich bekomme den gleichen Fehler, wenn ich das Datum als eine '2015-01-01' Zeichenfolge anstelle einer datetime.date Obje halten ct, und wenn ich curs.execute (sql_text, Daten) anstelle von mogrify verwenden.

Ich übergebe eine Liste, also glaube ich nicht, dass dies mit dem häufiger auftretenden Einzeltupelfehler zusammenhängt, den ich in anderen Fragen fand, der notwendig ist, um eine Nicht-String-Sequenz zu erzeugen und explizit in ein Tupel zu konvertieren behebe den Fehler.

Weiß jemand, warum die psycopg2-String-Formatierung einen Fehler gibt?

+0

Sie haben nur einen Wertplatzhalter für vier Werte. – Keith

Antwort

1

Sie können Ihre Original-Code halten, sondern weiter ein Tupel in statt einer Liste:

sql_text = "INSERT INTO ssurgo.distmd VALUES %s ;" 
data = ('5', date.today(), 'Successful', 4891) 
print(curs.mogrify(sql_text, [data])) 

Beachten Sie, dass Sie einen einzelnen Wert sind vorbei, so dass es notwendig ist, sie in einem iterable zu wickeln, das ist das, was psycopg erwartet. Das Tupel wird von Psycopg an die korrekte Syntax values angepasst: ein Datensatz

+0

Danke - das ist mehr das Verhalten, das ich erwartet habe. Ich hatte auf dem Weg etwas Ähnliches versucht, aber im zweiten Argument von Mogrify versucht, in ein Tupel zu konvertieren. Ich denke, es muss ein Tupel in der zweiten Zeile sein (nicht eine Liste), und dann muss es Teil einer einzelnen Gegenstandsliste in der dritten Zeile sein. –

+0

Es ist möglich, in das Mogrify-Argument in ein Tupel zu konvertieren, aber die Syntax ist schwierig. –

+0

Drucken (curs.mogrify (sql_text, [Tupel (Daten)]) funktionierte, aber nicht so gut lesbar. –

0

Dank @Keith für die Hilfe. Ich habe erwartet, dass psycopg2 mehr leistet als es tatsächlich tut. Da ich ein Skript entwickle durch mehrere hundert Textdateien für den Import in verschiedenen Tabellen zu wiederholen, möchte ich etwas, das mit verschiedenen Tischgrößen und machte die folgende Änderung arbeiten können:

sql_text = "INSERT INTO ssurgo.distmd VALUES (%s);" 
data = ['5', '2015-01-01', 'Successful', 4891] 
data[1] = date.today() # ensure psycopg2 recognizes a date using datetime 
placehold = ['%s' for _fld in data] 
sql_text = sql_text % ', '.join(placehold) 
print(curs.mogrify(sql_text, data)) 
Verwandte Themen