[英]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
和窗口函数创建这种最大n组关系的方法 ,如果所讨论的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.