curr.execute(“”“INSERT INTO CITY(name)values(%s);”“”,(cities))无法将列表插入db

时间:2016-12-30 03:32:02

标签: python postgresql

我正在尝试将一个列表插入到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. 一个 ñ 等等 插入到数据库中,即每行都有一个字母。

3 个答案:

答案 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)