簡體   English   中英

如何將包含sqlalchemy查詢語句的循環的速度提高為條件

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

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