[英]How to improve the speed of a loop containing a sqlalchemy query statement as conditional
此循環檢查記錄是否在sqlite數據庫中,並為缺少的那些記錄構建字典列表,然后使用列表執行多個insert語句。 這有效,但它非常慢(至少我認為它很慢),因為它需要5分鍾來循環超過3500個查詢。 我是python,sqlite和sqlalchemy的完全新手,所以我想知道是否有更快的方法來做到這一點。
list_dict = []
session = Session()
for data in data_list:
if session.query(Class_object).filter(Class_object.column_name_01 == data[2]).filter(Class_object.column_name_00 == an_id).count() == 0:
list_dict.append({'column_name_00':a_id,
'column_name_01':data[2]})
conn = engine.connect()
conn.execute(prices.insert(),list_dict)
conn.close()
session.close()
編輯:我在循環外移動了session = Session()
。 沒有什么區別。
解決方案
感謝mcabral的回答我將代碼修改為:
existing_record_list = []
list_dict = []
conn = engine.connect()
s = select([prices.c.column_name_01], prices.c.column_name_00==a_id)
result = conn.execute(s)
for row in result:
existing_record_list.append(row[0])
for data in raw_data['data']:
if data[2] not in existing_record_list:
list_dict.append({'column_name_00':a_id,
'column_name_01':data[2]}
conn = engine.connect()
conn.execute(prices.insert(),list_dict)
conn.close()
這需要6秒鍾。 這是一些改進!!
3500個查詢似乎很多,
您是否考慮在一個查詢中提取所有實體? 然后,您將遍歷內存中的列表,而不是查詢每個項目的數據庫。
很高興你找到了有用的東西,額外的2美分:
我同意mcabral。 作為一般規則,如果您在循環中放置查詢,則會遇到麻煩。 流行的SQL DB通常針對數據采集進行了優化。 循環查詢通常表明您在程序上正在執行應該/可以使用單個查詢或字符串執行的操作,這些查詢將數據相互放入。
這有例外,但根據我的經驗,它們通常很少而且很遠......每次我通過循環運行查詢時,我后悔了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.