在executemany()INSERT语句中使用字符串列表的TypeError

时间:2016-05-11 22:31:50

标签: python-2.7 psycopg2 postgresql-9.3

我试图通过Psycopg2模块通过Python对PostgreSQL数据库进行基本的INSERT操作。我已经阅读了很多关于这个主题以及文档的问题,但我似乎做了一些独特的错误,并且没有任何修复似乎适用于我的代码。

#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
)

循环创建一个字符串列表,在打印时看起来像这样:

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

我只是想让代码INSERT这些字符串作为表中的每一行。

运行时指定的错误是:

TypeError: not all arguments converted during string formatting

我尝试将INSERT更改为:

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

但这似乎只是将整个列表视为单个字符串,因为它产生了:

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

我错过了什么?

1 个答案:

答案 0 :(得分:1)

首先在您粘贴的代码中:

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

不是完成你想要做的事情的正确方法。 第一个列表是python中的保留字,你不应该将它用作变量名。我假设你的意思是溃疡。

如果你真的需要访问python中项目的索引,可以使用enumerate:

for x, item in enumerate(ulist):

但是,做你想做的事情的最好方法就是

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

你的第一次尝试是:

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

你的第二次尝试是:

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

我认为你想要的是:

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

你可以通过以下方式获得:

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

或事件更好:

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)