簡體   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