Использование латерального соединения из подзапроса в sqlalchemyPython

Программы на Python
Anonymous
Использование латерального соединения из подзапроса в sqlalchemy

Сообщение Anonymous »

У меня есть 2 таблицы (определенные как модели в Python): «Продукты» и «Задачи».
Производство может содержать 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
Теперь мне нужно реализовать это в моем приложении Python с помощью sqlalchemy.
Я определил свои продукты и задачи с помощью 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

Вернуться в «Python»