Производство может содержать 1 или более задач.
Задачи имеют имя (строку), значение приоритета (int) и состояние (TODO/ACTIVE/COMPLETE).
Мне нужно найти все производства с ActiveTask с определенным именем.
ActiveTask производства определяется как первый ( наименьший приоритет) производственная задача, находящаяся в состоянии TODO или ACTIVE.
Следующий сценарий MySQL делает свое дело:
Код: Выделить всё
SELECT production.*, active_task.*
FROM PRODUCTIONS production
JOIN LATERAL (
SELECT active_task.*
FROM PRODUCTIONTASKS active_task
WHERE active_task.production_id = production.id
AND active_task.state IN ('TODO', 'ACTIVE')
ORDER BY active_task.priority
LIMIT 1
) active_task ON TRUE
Я определил свои продукты и задачи с помощью sqlalchemy.
Код: Выделить всё
class ProductionModel():
__tablename__ = "PRODUCTIONS"
product_id = Column(ForeignKey("PRODUCTS.id", name="product_id"), nullable=False, index=True)
Код: Выделить всё
class ProductionTaskModel():
__tablename__ = "PRODUCTIONTASKS"
production_id = Column(ForeignKey("PRODUCTIONS.id"), nullable=True, index=True)
priority = Column(Integer())
name = Column(String(45, collation="utf8mb4_bin"))
state = Column(String(45, collation="utf8mb4_bin"))
Это пример:
Код: Выделить всё
ActiveTask = aliased(ProductionTaskModel)
active_task_subquery = (
select(ActiveTask)
.where(
ActiveTask.production_id == ProductionModel.id,
ActiveTask.state.in_(['TODO', 'ACTIVE'])
)
.order_by(ActiveTask.priority)
.limit(1)
.lateral()
)
productions = (
query
.select_from(ActiveTask)
.join(active_task_subquery, true())
.add_entity(ActiveTask)
.limit(page_size)
.all()
)
sqlalchemy.exc.InvalidRequestError: оператор Select '' не вернул никаких предложений FROM из-за auto -корреляция; укажите корреляцию() для управления корреляцией вручную.
Подробнее здесь: https://stackoverflow.com/questions/786 ... sqlalchemy