2016-05-11 12 views
0

Ich versuche, eine einfache INSERT-Operation zu einer PostgreSQL-Datenbank durch Python über das Psycopg2-Modul. Ich habe sehr viele der Fragen gelesen, die bereits zu diesem Thema und der Dokumentation gepostet wurden, aber ich habe anscheinend etwas eindeutig falsch gemacht und keine der Fixes scheint für meinen Code zu funktionieren.TypeError während Executemany() INSERT-Anweisung mit einer Liste von Zeichenfolgen

#API CALL + JSON decoding here 
x = 0 
for item in ulist: 
    idValue = list['members'][x]['name'] 
    activeUsers.append(str(idValue)) 
    x += 1 

dbShell.executemany("""INSERT INTO slickusers (username) VALUES (%s)""", activeUsers 
) 

Die Schleife erstellt eine Liste von Strings, die wie folgt aussieht, wenn sie gedruckt:

['b2ong', 'dune', 'drble', 'drars', 'feman', 'got', 'urbo'] 

ich gerade versuche, den Code INSERT haben diese Strings als 1 Zeile jeder in der Tabelle.

Der angegebene Fehler beim Laufen ist:

TypeError: not all arguments converted during string formatting 

Ich versuchte, die INSERT Wechsel:

dbShell.executemany("INSERT INTO slackusers (username) VALUES (%s)", (activeUsers,)) 

Aber das scheint, wie es nur ist die gesamte Liste als einzelne Zeichenfolge zu behandeln, wie es ergibt:

psycopg2.DataError: value too long for type character varying(30) 

Was fehlt mir?

Antwort

1

Zuerst in dem Code, den Sie eingefügt:

x = 0 
for item in ulist: 
    idValue = list['members'][x]['name'] 
    activeUsers.append(str(idValue)) 
    x += 1 

Ist das nicht der richtige Weg zu erreichen, was Sie zu tun versuchen. erste Liste ist ein reserviertes Wort in Python und Sie sollten es nicht als Variablenname verwenden. Ich nehme an, du meintest Ulist.

wenn Sie wirklich Zugang zum Index eines Elements in Python benötigen, können Sie verwenden, aufzuzählen:

for x, item in enumerate(ulist): 

aber der beste Weg, zu tun, was Sie versuchen zu tun, so etwas wie

for item in ulist: # or list['members'] Your example is kinda broken here 
    activeUsers.append(str(item['name'])) 

Ihr erster Versuch war:

['b2ong', 'dune', 'drble', 'drars', 'feman', 'got', 'urbo'] 

Ihr zweiter Versuch war:

(['b2ong', 'dune', 'drble', 'drars', 'feman', 'got', 'urbo'],) 

Was ich denke, Sie wollen, ist:

[['b2ong'], ['dune'], ['drble'], ['drars'], ['feman'], ['got'], ['urbo']] 

Sie könnten dies viele Möglichkeiten erhalten:

dbShell.executemany("INSERT INTO slackusers (username) VALUES (%s)", [ [a] for a in activeUsers]) 

oder Ereignis besser:

for item in ulist: # or list['members'] Your example is kinda broken here 
    activeUsers.append([str(item['name'])]) 
dbShell.executemany("""INSERT INTO slickusers (username) VALUES (%s)""", activeUsers) 
+0

Sie für die Hilfe danken und Informationen, die ich über diese Best Practices nicht wusste. Darüber hinaus habe ich Ihren Code sowie einen commit() - Aufruf für das Verbindungsobjekt verwendet, da ich gerade festgestellt habe, dass psycopg2 automatisch Transaktionen öffnet und nur dann commit, wenn Sie dies ausdrücklich tun. –

Verwandte Themen