SQLAlchemy 插入返回具有多个值的主键

SQLAlchemy insert returning primary key with multiple values

我正在尝试使用 SQLAlchemy 的插入和执行方法,将字典列表作为值,并取回插入的 ID。数据库为Postgres,应该支持RETURNING。

代码大致如下所示:

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) no results to fetch

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

我知道我可能在使用返回的方式中遗漏了一些东西,但我不知道是什么。

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

values 应该是插入多个值时的列表,默认情况下 sqlalchemy 会绑定参数,除非 literal_binds 选项设置为 True,这样可以安全地进行操作绑定参数

values = [{"name_val": "a"}, {"name_val": "b"}]
insert_stmt = table.insert().values(values).returning(table.c.id)
result = session.execute(insert_stmt).fetchall()

假设您想保留现有的显式绑定,values 为插入语句传递的必须是关键字参数。您现有的查询将更新如下:

bind_params = [{"name_val": "a"}, {"name_val": "b"}]
insert_stmt = table.insert().values(name_val=bindparam("name_val")).returning(table.c.id)
result = session.execute(insert_stmt, bind_params).fetchall()