2017-09-19 3 views
1

エンジンで「エコー」をオンにして、query.all()を呼び出すとDBクエリが1回送信され、次に各レポートに対してクエリが送信されます。report.as_dict()はフィールドにアクセスします。SQLAlchemyリスト内の各エンティティに対するリクエストを送信

query = db_session.query(Report) 
query = query.filter(or_(Report.network_id == network_id, Report.network_id == None)) 
reports = query.all() 
db_session.commit() 
resp = [report.as_dict() for report in reports] 

クエリquery.all()に送られた -

2017-09-19 16:02:28,504 INFO sqlalchemy.engine.base.Engine SELECT report.id AS report_id, report.network_id AS report_network_id, report.account_id AS report_account_id, report.name AS report_name, report.notes AS report_notes, report.structure AS report_structure, report.type AS report_type, report.version AS report_version 
FROM report WHERE report.network_id = %(network_id_1)s OR report.network_id IS NULL ORDER BY report.id 
2017-09-19 16:02:28,504 INFO sqlalchemy.engine.base.Engine {'network_id_1': '5850'} 

report.as_dict()(PARAM_1 =レポートID)にアクセスし、各レポートのために - 報告書の全体リストがあるよう

2017-09-19 16:04:15,100 INFO sqlalchemy.engine.base.Engine SELECT report.id AS report_id, report.network_id AS report_network_id, report.account_id AS report_account_id, report.name AS report_name, report.notes AS report_notes, report.structure AS report_structure, report.type AS report_type, report.version AS report_version 
FROM report WHERE report.id = %(param_1)s 
2017-09-19 16:04:15,100 INFO sqlalchemy.engine.base.Engine {'param_1': 1} 

に見えます最初のクエリで取得されましたが、まだそれぞれのクエリが送信されていますが、どのようにこの動作を変更できますか?
私の環境:あなたがTrueexpire_on_commitセットを持っているので、これはされているWindows 10、Pythonの3.5.0、SQLAlchemyの1.2.0b2

答えて

2

は、そうとすぐにsession.commit()を行うようSQLAlchemyのはあなただけで照会したすべてのデータを破棄します。あなたはセッションでそれをオフにする必要があります。

db_session = Session(expire_on_commit=False) 

これが原因で発生した前提条件に違反しないことに注意してください。

関連する問題