我正在尝试将一个列表插入到postgres表中。
在try中,它在这一行失败了:
curr.execute("""INSERT INTO CITY (name) values (%s);""",(cities))
我尝试了很多变化,包括只使用一个字符串或括号,但没有任何工作。我也尝试过executemany,但也不行。
try:
conn = psycopg2.connect("dbname=testapp user=postgres")
curr = conn.cursor()
curr.execute("""INSERT INTO CITY (name) values (%s);""",(cities))
conn.commit()
curr.close()
conn.close()
除了: 打印(“无法插入”)
编辑:
我得到“并非所有在字符串格式化过程中转换的参数”都带有execute或executemany。
我使用
创建了一个较小的城市列表cities = ['San Francsico','San Jose']
但实际列表中有100个城市。
如果我使用
curr.executemany("INSERT INTO CITY (name) values (%s);","San Francisco",)
然后S. 一个 ñ 等等 插入到数据库中,即每行都有一个字母。
答案 0 :(得分:4)
问题是,你应该将你的查询参数保留在一个元组中:
city = "San Francisco"
curr.execute("""INSERT INTO CITY (name) values (%s);""", (city, ))
请注意city
之后的逗号。
如果是executemany()
,您应该有一个元组列表:
params = [("San Francisco", )]
curr.executemany("INSERT INTO CITY (name) values (%s);", params)
或者词典列表,如果您使用命名参数:
params = [
{"city": "San Francisco"}
]
curr.executemany("INSERT INTO CITY (name) values (%(city)s);", params)
如果您想将cities
列表调整为executemany()
,可以使用:
params = [[city] for city in cities]
curr.executemany("INSERT INTO CITY (name) values (%s);", params)
注意:实际上,当我说“元组”时,我不是100%正确 - iterables 可能是一个更好的词 - 它只是元组通常用于查询参数。为了简单起见,我会保留答案。
答案 1 :(得分:1)
为什么要使用"""
,将其更改为"
?
curr.execute("INSERT INTO CITY (name) VALUES (%s)", (cities))
并打印异常获取更多详细信息:
try:
conn = psycopg2.connect("dbname=testapp user=postgres")
curr = conn.cursor()
curr.execute("INSERT INTO CITY (name) VALUES (%s)", (cities))
conn.commit()
curr.close()
conn.close()
except Exception as ex:
print(ex) # print exception detail
<强>更新强>
您应该使用批量插入,例如:
INSERT INTO CITY (name) VALUES (%s),(%s),(%s)
答案 2 :(得分:1)
executemany
需要列表或元组列表。
cities = [['San Francsico'],['San Jose']]
curr.executemany("INSERT INTO CITY (name) values (%s);",cities)