簡體   English   中英

首選哪種方式:with(context-manger) db session + for 循環

[英]Which way is preferred: with(context-manger) db session + for loop

#using sqlalchemy

for item in large_list_of_complex_objects:
   with postgres.PostgresSessionMaker() as session:
        ...
        device_db = session.query(SomeTable).filter(SomeTable.id == item.id).all()
        ...

或者

with postgres.PostgresSessionMaker() as session:
        for item in large_list_of_complex_objects:
            ...
            device_db = session.query(SomeTable).filter(SomeTable.id == item.id).all()
            ...

就pythonic /效率而言,哪一個是首選?

這里有兩種可能的優化。

首先,在循環初始化 session。 反復關閉和打開會話會在您的應用程序中產生不必要的開銷。

其次,如果可以避免,請不要在循環中執行多個相同的查詢,而不是查詢值。 請改用IN子句。

因此,最佳查詢可能如下所示:

with postgres.PostgresSessionMaker() as session:
    item_ids = [obj.id for obj in large_list_of_complex_objects]
    device_dbs = session.query(SomeTable).filter(SomeTable.id.in_(item_ids)).all()
    ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM