繁体   English   中英

在SQLAlchemy中过滤大关系子查询

[英]Filtering a large relationship subquery in SQLAlchemy

考虑一个具有关系的简单SQLAlchemy模型:

class User(Base):

    __tablename__ == 'users'

    friends = relationship('User', secondary=friend,
        primaryjoin=id == friend.c.to_id,
        secondaryjoin=id == friend.c.from_id,
        order_by=friends.c.id,
        lazy='subquery')

在某些病态情况下,用户可能会有很多朋友,因此这个查询非常昂贵:

user_friends = user.friends

如何执行相同的子查询,例如请求特定的order_by和限制N对象? 我想做点什么:

some_friends = user.friends.order_by('some_field').limit(10)

但我无法从文档中了解如何在子查询配置这些查询选项。

停止将此问题标记为重复,所谓的重复问题与处理子查询无关。

确实根据@ malan的建议,如果没有明确需要subquery ,那么使用lazy='dynamic'是这种情况最简单的解决方案。

似乎SQLAlchemy的较新版本(1.3及更高版本)引入了一种使用AliasedClass和窗口函数创建这种关系的方法 ,如果所讨论的DBMS支持窗口函数:

class User(Base):
    ...

top_friends = select([
        User,
        friend.c.to_id,
        func.row_number().over(partition_by=friend.c.to_id, 
                               order_by=User.some_field).label('index')]).\
    select_from(join(User, friend, User.id == friend.c.from_id)).\
    alias()

friend_user = aliased(User, top_friends)

User.friends = relationship(
    friend_user,
    primaryjoin=and_(User.id == top_friends.c.to_id, top_friends.c.index <= 10))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM