Как повысить скорость цикла, содержащего оператор запроса sqlalchemy как условный - PullRequest
3 голосов
/ 09 апреля 2010

Этот цикл проверяет, находится ли запись в базе данных sqlite, и создает список словарей для тех записей, которые отсутствуют, а затем выполняет оператор множественной вставки со списком. Это работает, но это очень медленно (по крайней мере, я думаю, что это медленно), так как требуется 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()

edit: я переместил 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 секунд. Это некоторое улучшение !!

Ответы [ 2 ]

2 голосов
/ 09 апреля 2010

3500 запросов кажется большим числом,

Рассматривали ли вы выборку всех сущностей в одном запросе? Затем вы будете перебирать список в памяти, а не запрашивать базу данных для каждого элемента.

0 голосов
/ 29 сентября 2012

Рад, что вы нашли что-то, что работает, как дополнительные 2 цента:

Я согласен с mcabral. Как правило, если вы помещаете запрос в цикл, вы напрашиваетесь на неприятности. Популярные базы данных SQL обычно оптимизированы для сбора данных. Цикл запроса обычно означает, что вы процедурно делаете что-то, что должно / могло бы быть выполнено либо с одним запросом, либо со строкой запросов, которые помещают данные друг в друга.

Есть исключения из этого, но из моего опыта их обычно немного, и они далеко друг от друга ... Каждый раз, когда я запускал запрос через цикл, я потом сожалел об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...