Используя SQLAlchemy, я имею следующую конструкцию моделей:
Category
- slug as String (unique)
...
Sample
- label
...
Result
- sample_id (relation)
...
Specs
- result_id (relation)
- category_id (relation)
- version as Integer
...
Мне удалось получить последние результаты для всех образцов, используя объяснение в Запрос фильтра SQLAlchemy по связанному объекту ицикл python for:
def get_latest_results(sample):
subq = db.session.query(Specs.category_id, func.max(Specs.version).label('latest_version')) \
.filter(Specs.result.any(sample=sample)) \
.group_by(Specs.category_id).subquery('t2')
query = db.session.query(Result).join(
subq,
and_(
Result.specs.has(category_id=subq.c.category_id),
Result.specs.has(version=subq.c.latest_version),
Result.sample == sample,
)
).all()
return query
for sample in Sample.query.all():
print(get_latest_results(sample))
Теперь я пытаюсь создать запрос sqlalchemy, который выполняет все в одной конструкции.
До сих пор каждая попытка приводила к отсутствующим или дополнительным нежелательным результатам...
Входные данные выглядят примерно так:
Sample-1 Result-1 Specs-1-version-1 Category A
Sample-1 Result-2 Specs-2-version-2 Category A
Sample-1 Result-3 Specs-3-version-1 Category B
Sample-2 Result-4 Specs-4-version-1 Category A
Sample-2 Result-5 Specs-5-version-1 Category B
Желаемый результат (на самом деле я хочу, чтобы объекты Result, я показываю здесь все связанные данные для полноты), выглядит примерно так:
Sample-1 Result-2 Specs-2-version-2 Category A
Sample-1 Result-3 Specs-3-version-1 Category B
Sample-2 Result-4 Specs-4-version-1 Category A
Sample-2 Result-5 Specs-5-version-1 Category B
Есть идеи по созданию этого набора запросов?