【问题标题】:Many to many query in sqlalchemysqlalchemy 中的多对多查询
【发布时间】:2021-01-30 06:30:40
【问题描述】:

我的问题有表格。

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'))

我想在两个 sql 查询中选择所有具有预取角色的模板,就像 Django ORM 对 prefetch_related 所做的那样。我可以做吗? 这是我目前的尝试。

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}')

但是..

  1. 它为每个模板生成选择查询以选择其角色。我可以让 sqlalchemy 只做一个查询吗?
  2. 生成的角色查询没有连接,只有FROM recipient_role, template_to_roleWHERE %(param_1)s = template_to_role.template_id AND recipient_role.id = template_to_role.role_id。对吗?

你能帮帮我吗?

【问题讨论】:

    标签: python postgresql sqlalchemy


    【解决方案1】:

    基于此答案: flask many to many join as done by prefetch_related from django

    可能是这样的:

    roles = TemplateExtra.query.options(db.joinedload(TemplateExtra.roles)).all

    让我知道它是否有效。

    【讨论】:

    • 经过额外研究得出了相同的结果。接受你的回答。 SQLAlchemy 文档很糟糕 :) 我之前所有试图找出正确查询方式的尝试都一无所获。
    猜你喜欢
    • 1970-01-01
    • 2017-04-03
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 2011-09-26
    • 1970-01-01
    • 2019-01-18
    相关资源
    最近更新 更多