Consulta de muitos para muitos em sqlalchemy
Oct 16 2020
Existem tabelas para a minha pergunta.
class TemplateExtra(ExtraBase, InsertMixin, TimestampMixin):
__tablename__ = 'template_extra'
id = Column(Integer, primary_key=True, autoincrement=False)
name = Column(Text, nullable=False)
roles = relationship(
'RecipientRoleExtra',
secondary='template_to_role',
)
class RecipientRoleExtra(
ExtraBase, InsertMixin, TimestampMixin,
SelectMixin, UpdateMixin,
):
__tablename__ = 'recipient_role'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(Text, nullable=False)
description = Column(Text, nullable=False)
class TemplateToRecipientRoleExtra(ExtraBase, InsertMixin, TimestampMixin):
__tablename__ = 'template_to_role'
id = Column(Integer, primary_key=True, autoincrement=True)
template_id = Column(Integer, ForeignKey('template_extra.id'))
role_id = Column(Integer, ForeignKey('recipient_role.id'))
Eu quero selecionar todos os modelos com funções pré-buscadas em duas consultas sql como o Django ORM faz com prefetch_related. Posso fazer isso? Esta é minha tentativa atual.
def test_custom():
# creating engine with echo=True
s = DBSession()
for t in s.query(TemplateExtra).join(RecipientRoleExtra, TemplateExtra.roles).all():
print(f'id = {t.id}')
for r in t.roles:
print(f'-- {r.name}')
Mas..
- ele gera consulta selecionada para cada modelo para selecionar suas funções. Posso fazer sqlalchemy para fazer apenas uma consulta?
- consultas geradas para funções são sem junção, apenas
FROM recipient_role, template_to_rolecomWHERE %(param_1)s = template_to_role.template_id AND recipient_role.id = template_to_role.role_id. Está correto?
Você pode me ajudar?
Respostas
1 ky_aaaa Oct 16 2020 at 21:46
Com base nesta resposta: junção de muitos para muitos como feita por prefetch_related do django
Talvez algo assim:
roles = TemplateExtra.query.options(db.joinedload(TemplateExtra.roles)).all
Deixe-me saber se funcionou.
O que significa um erro “Não é possível encontrar o símbolo” ou “Não é possível resolver o símbolo”?
George Harrison ficou chateado por suas letras de 'Hurdy Gurdy Man' de Donovan não terem sido usadas