[英]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.