Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy insert返回具有多个值的主键_Python_Postgresql_Sqlalchemy_Bulkinsert - Fatal编程技术网

Python SQLAlchemy insert返回具有多个值的主键

Python SQLAlchemy insert返回具有多个值的主键,python,postgresql,sqlalchemy,bulkinsert,Python,Postgresql,Sqlalchemy,Bulkinsert,我试图使用SQLAlchemy的insert和execute方法,并将字典列表作为值,然后获取插入的ID。数据库是Postgres,应该支持返回 代码大致如下所示: table = MyThing.__table__ insert_stmt = table.insert().values({"name": bindparam("name_val")}).returning(table.c.id) values = [{"name_val": "a"}, {"name_val": "b"}] re

我试图使用SQLAlchemy的insert和execute方法,并将字典列表作为值,然后获取插入的ID。数据库是Postgres,应该支持返回

代码大致如下所示:

table = MyThing.__table__
insert_stmt = table.insert().values({"name": bindparam("name_val")}).returning(table.c.id)
values = [{"name_val": "a"}, {"name_val": "b"}]
result = session.execute(insert_stmt, values).fetchall()
(为了可读性和一些模糊性,进行了精简)

当值列表大于1时(如上例所示),我得到:

sqlalchemy.exc.ProgrammingError:(psycopg2.ProgrammingError)没有要获取的结果

但是,当列表只有一个值时,新id将正确返回


我知道我在使用returning时可能遗漏了一些东西,但我不知道是什么。

在第二个参数传递给
session.execute的值列表中重复了相同的bind参数

插入多个值时,
values
应该是一个列表,默认情况下,sqlalchemy会绑定参数,除非
literal\u binds
选项设置为
True
,这样在不显式绑定参数的情况下操作是安全的

values=[{“name\u val”:“a”},{“name\u val”:“b”}]
insert_stmt=table.insert().values(值)。返回(table.c.id)
结果=session.execute(insert_stmt).fetchall()
假设要保留现有的显式绑定,为insert语句传递的
值必须是关键字参数。您的现有查询将更新如下:

bind_params=[{“name_val”:“a”},{“name_val”:“b”}]
insert_stmt=table.insert().values(name_val=bindparam(“name_val”))。返回(table.c.id)
结果=session.execute(insert_stmt,bind_params).fetchall()

根本原因是,当将bindparams传递给
values()
和参数集合列表(大于1)传递给
execute()
SQLA使用时,在返回结果集的操作上使用这些参数是未定义的,因此任何事情都可能发生
已解释:第一个建议呈现单个
插入。。。值
语句和简单的
execute()
而不是使用
executemany()
,因此可以返回结果。这是一个有趣的解释@IljaEverilä。考虑到编译语句是单个语句,我很惊讶在连接上调用了
executemany
。谢谢你提到这件事。