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