首页 > 解决方案 > 使用 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)#...?

标签: pythonsqlalchemyprimary-key

解决方案


@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'));

推荐阅读