python - 使用 SqlAlchemy 通过主键列表从数据库加载多个实例
问题描述
如果我有一个复合主键列表,是否有一种优雅的方法可以使用 SqlAlchemy 从数据库中加载许多实体?
一个对象可以加载Query.get(*primary_key)
。他们的名单呢?例如:
primary_keys = [
{"type":"user", "id": 1},
{"type":"user", "id": 2},
{"type":"user", "id": 3},
]
instances = ssn.query(models.Object)#...?
解决方案
@vdmit11 使用 SQL 元组的更优雅的解决方案:
from sqlalchemy import inspect, tuple_
# List of Column objects of the primary key
pk_columns = inspect(models.Object).primary_key
pk_names = [col.key for col in pk_columns]
# Build the condition: (primary-key-tuple) IN (....)
condition = tuple_(*pk_columns).in_(
# Every object is represented by its primary key tuple
tuple(entity_dict[pk_field] for pk_field in pk_names)
for entity_dict in primary_keys
)
instances = ssn.query(models.Object).filter(condition).all()
它将生成一个如下所示的查询:
SELECT *
FROM users
WHERE (uid, login) IN ((1, 'vdmit11'), (2, 'kolypto'));
推荐阅读
- java - 圣杯。将文件上传到临时文件夹并在 gsp 中显示
- firebase - FirebaseDatabase:写入位置无效:/.info/connected
- drupal - Drupal 8 新手 - 如何访问 page.html.twig 中的字段?
- c# - 无法解析 Packages/manifest.json
- mysql - 使用 pgloader 将 mysql 迁移到 postgres
- python - 在 Mac os X 上使用 tarfile 打开 .tgz 文件
- java - 当作业再次运行时,Spring 批处理阅读器不会“重新读取”
- python - 处理回归问题中分类变量的最佳方法 - python
- python - 如何使用 Python 中的多处理模块来调用应用程序的不同副本?
- .net - .NET Core Web API 从内存流返回 Zip 文件