【问题标题】:sqlalchemy: subqueryload with filter on the subquerysqlalchemy:在子查询上带有过滤器的子查询加载
【发布时间】:2011-11-06 09:06:14
【问题描述】:

在 sqlalchemy 中,是否可以过滤关系的子查询加载返回的结果?考虑以下内容(请忽略任何语法/api 错误)

关系:

User.address = relationship(Address,
                            secondary = UserAddress,
                            primaryjoin = (User.userid == UserAddress.userid),
                            secondaryjoin = (UserAddress.addressid == Address.addressid))

查询:

session.query(User).options(subqueryload(User.addresses))

这将给我所有符合加入条件的地址。但是,如果我想进一步过滤地址怎么办。例如,如果用户以访客身份登录,他/她应该只能看到另一个用户的公司地址,而不是他/她的家庭地址。所以类似(假设):

if user_group == 'guest':
    option = subqueryload(User.addresses).filter(Address.type != 'home')
else:
    option = subqueryload(User.addresses)
q = session.query(User).options(options)

这不能表示为primaryjoin 或secondaryjoin 中的条件。这种情况我该怎么办?

谢谢,

【问题讨论】:

    标签: python sqlalchemy relationship


    【解决方案1】:

    你想要地址,对吧?只需从对方做一个简单的查询(user_id是一个参数):

    qry = session.query(Address).join(User).filter(User.id == user_id)
    if user_group == 'guest':
        qry = qry.filter(Address.type != 'home')
    addresses = qry.all()
    

    【讨论】:

    • 我的例子是一个更大问题的简化版本。您的解决方案在这种情况下有效,但我正在寻找一种通用解决方案,使我能够向连接条件添加其他条件。我将在下面提出另一个问题:
    • 假设我有一个多租户系统,其中租户共享同一个表,并通过额外的键“systemid”来区分。关系中的连接条件将有 Address.systemid==User.systemid,但是,在使用给定系统的地址查询用户时,如果我们在子查询中加载关系,我们需要在连接条件中添加 systemid=$current_systemid或者我们最终得到一个执行全表扫描的子查询。所以需要subquery.filter(Address.systemid==current_systemid)。这只是为什么需要对子查询进行过滤的示例之一。
    猜你喜欢
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 2015-01-15
    • 1970-01-01
    • 2015-05-11
    • 2020-11-14
    相关资源
    最近更新 更多