python - SQLAlchemy插入返回具有多个值的主键
问题描述
我正在尝试使用带有字典列表作为值的 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) 没有要获取的结果
但是当列表只有一个值时,新的 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()
推荐阅读
- docker - 从站上的管道失败
- git - 在最初创建提交的 Bitbucket 上查找拉取请求
- python - 将 PySpark 命令转换为自定义函数
- eclipse - 使用导出为 PDF 的 BIRT 报告在单元格上换行
- javascript - 换行符不会连接
- rest - Spring-boot 使用可分页测试休息控制器
- php - 数据库插入不起作用并且没有给出任何错误
- ios - 如何为 Flutter 应用创建 iOS LaunchScreen.storyboard?
- dart - Dart 2.0.0 访问扩展另一个类的变量
- javascript - 如何在 React 中分别切换多个显示