SQLAlchemy: наиболее эффективный способ выбрать родительский элемент с несколькими дочерними элементами, допускающими зн ⇐ Python
SQLAlchemy: наиболее эффективный способ выбрать родительский элемент с несколькими дочерними элементами, допускающими зн
Я хочу выбрать родительского элемента только с одним ненулевым ChildType. Вот схема, если быть точнее:
Родительский класс (Базовый): ... идентификатор: Сопоставлено[int] тип: Сопоставлено[str] child_type_a: Сопоставлено['ChildTypeA | Нет'] = связь (uselist=False) child_type_b: Сопоставлено['ChildTypeB | Нет'] = связь (uselist=False) child_type_c: Mapped['ChildTypeC | Нет'] = связь (uselist=False) класс ChildTypeA/B/C(базовый): идентификатор: Сопоставлено[int] Parent_id: Mapped[int] = Mapped_column(BigIntegerType, ForeignKey('parent_table.id')) родительский элемент: Mapped['Parent'] = Relations(back_populates="child_type_a/b/c") В моем случае каждый Родитель может иметь только одного дочернего элемента из этих трех типов (a, b, c). Поэтому я хотел бы присоединиться только к таблице, в которой есть запись, ссылающаяся на этот конкретный Parent.
На данный момент единственное работающее решение, которое я придумал, — это объединить все таблицы ChildType:
select(Родительский) .join(ChildTypeA, ChildTypeA.parent_id == Parent.id) .join(ChildTypeB, ChildTypeB.parent_id == Parent.id) .join(ChildTypeC, ChildTypeC.parent_id == Parent.id) .параметры( contains_eager(Parent.child_type_a), contains_eager(Parent.child_type_b), contains_eager(Parent.child_type_c), ) Но, насколько я понимаю, он ищет по всем таблицам, даже по тем, из которых не ссылается наш текущий Parent. В идеале было бы неплохо иметь какое-то условное соединение на основе поля Parent.type («a», «b», «c»).
Я хочу выбрать родительского элемента только с одним ненулевым ChildType. Вот схема, если быть точнее:
Родительский класс (Базовый): ... идентификатор: Сопоставлено[int] тип: Сопоставлено[str] child_type_a: Сопоставлено['ChildTypeA | Нет'] = связь (uselist=False) child_type_b: Сопоставлено['ChildTypeB | Нет'] = связь (uselist=False) child_type_c: Mapped['ChildTypeC | Нет'] = связь (uselist=False) класс ChildTypeA/B/C(базовый): идентификатор: Сопоставлено[int] Parent_id: Mapped[int] = Mapped_column(BigIntegerType, ForeignKey('parent_table.id')) родительский элемент: Mapped['Parent'] = Relations(back_populates="child_type_a/b/c") В моем случае каждый Родитель может иметь только одного дочернего элемента из этих трех типов (a, b, c). Поэтому я хотел бы присоединиться только к таблице, в которой есть запись, ссылающаяся на этот конкретный Parent.
На данный момент единственное работающее решение, которое я придумал, — это объединить все таблицы ChildType:
select(Родительский) .join(ChildTypeA, ChildTypeA.parent_id == Parent.id) .join(ChildTypeB, ChildTypeB.parent_id == Parent.id) .join(ChildTypeC, ChildTypeC.parent_id == Parent.id) .параметры( contains_eager(Parent.child_type_a), contains_eager(Parent.child_type_b), contains_eager(Parent.child_type_c), ) Но, насколько я понимаю, он ищет по всем таблицам, даже по тем, из которых не ссылается наш текущий Parent. В идеале было бы неплохо иметь какое-то условное соединение на основе поля Parent.type («a», «b», «c»).
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение