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

标签 python postgresql sqlalchemy bulkinsert

我正在尝试使用带有字典列表作为值的 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()

(为了可读性和一些混淆而进行了修剪)

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

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) no results to fetch



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

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

最佳答案

相同的绑定(bind)参数在您传递给 session.execute 的第二个参数的值列表中重复。 .
values插入多个值时应该是一个列表,并且 sqlalchemy 默认绑定(bind)参数,除非 literal_binds选项设置为 True这样在不显式绑定(bind)参数的情况下是安全的

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

假设您想保留现有的显式绑定(bind) 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()

关于python - SQLAlchemy插入返回具有多个值的主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57758373/

相关文章:

java - 如何从xml文档中插入数据到postgresql?

database - 在创建数据库之前,Postgres 中如何存在 pg_roles 表?

python - sqlalchemy 过滤多列

python - 如何以给定的数字启动 SQLAlchemy primary_key?

python - 如何在 SQLAlchemy 中定义对继承列的约束?

python - Python 中的 C 函数 : Return an Array and Variables

python - 如何在 CentOS 6.4 上安装 urwid 1.1.1?

ruby-on-rails - PG::UndefinedFunction: 错误:运算符不存在:文本 = bool 值

python - 将单个值分配给切片的大多数 pythonic 和/或高性能方法?

python - 在cartopy(python)中获取经度和纬度的鼠标位置