Python SQLAlchemy insert返回具有多个值的主键
我试图使用SQLAlchemy的insert和execute方法,并将字典列表作为值,然后获取插入的ID。数据库是Postgres,应该支持返回 代码大致如下所示: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
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
。谢谢你提到这件事。