Загрузка нескольких экземпляров из БД с помощью списка первичных ключей с помощью SqlAlchemy - PullRequest
0 голосов
/ 24 октября 2019

Существует ли элегантный способ загрузки многих объектов из базы данных с помощью SqlAlchemy, если у меня есть список составных первичных ключей?

Один объект может быть загружен с помощью Query.get(*primary_key). Как насчет их списка? Например:

primary_keys = [
    {"type":"user", "id": 1},
    {"type":"user", "id": 2},
    {"type":"user", "id": 3},
]

instances = ssn.query(models.Object)#...?

Ответы [ 2 ]

0 голосов
/ 25 октября 2019

Более элегантное решение @ 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'));
0 голосов
/ 24 октября 2019

Просто переберите inspect(models.Object).primary_key и создайте условие вручную:

from sqlalchemy import or_, and_, inspect

instances = ssn.query(models.Object).filter(or_(  # or_()ed together
    # and_()ed condition on all PK fields
    and_(*(
        # column == value
        column == pk_dict[column.key]
        for column in inspect(models.Object).primary_key  # list of PK columns
    ))
    for pk_dict in primary_keys
))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...