Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 16, 2014 04:11:23

valet
Зарегистрирован: 2013-09-20
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

python sqlite выборка сразу целого списка

Есть список keys ключей, для которых с базы sqlite нужно выбрать список значений values.
Я делаю так: пробегаю циклом по списку keys, на каждой итерации беру по одному ключу, формирую с него кортеж, делаю выборку и дополняю результатом выборки список values, код примерно такой:

values = []
for key in keys:
	tuple_key = (unicode(key, errors='ignore'),)
	c.execute('SELECT value FROM mytable WHERE key=?', tuple_key)
	val1 = c.fetchone()
	values.append(val1)
Это выполняется очень долго, так как база sqlite очень большая - около 2 млн строк (40 Гб)
Подозреваю, что это можно сделать одним select запросом - то есть как бы выбрать все записи из БД, в которых поле key совпадает соотвественно с каждым элементом списка keys.

Подскажите пожалуйста, реально ли это?

Отредактировано valet (Окт. 16, 2014 04:12:43)

Офлайн

#2 Окт. 16, 2014 06:02:47

valet
Зарегистрирован: 2013-09-20
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

python sqlite выборка сразу целого списка

Разобрался сам , может кому-то пригодится, опубликую решение:

keys_u = [unicode(key, errors='ignore') for key in keys]
query = 'SELECT value FROM mytable WHERE key IN (%s)' % ', '.join(['?']*len(keys))
c.execute(query, keys_u)
values = c.fetchall()[0]

Главная идея такая: выполнить в execute запрос вида (SELECT value FROM mytable WHERE key IN (?, ?, … , ?), list)
Для чего:
1. формируем список ключей в unicode (нужно будет для правильного формирования запроса)
2. формируем первую часть запроса с нужным количеством параметров
3. выполняем и получаем все результаты

Время выполнения почти равно каждому отдельно взятому запросу как в варианте с перебором по циклу, но тут 1 запрос - то есть выигрыш колосальный!

Офлайн

#3 Фев. 22, 2015 19:04:28

warpson
От:
Зарегистрирован: 2010-10-27
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

python sqlite выборка сразу целого списка

sqlite3 размером в 40 Гиг - да быть того не может !
хоть и 1.5 года назад :)



Офлайн

#4 Фев. 22, 2015 20:12:06

alexbadaloff
От: Иваново
Зарегистрирован: 2013-04-11
Сообщения: 198
Репутация: +  16  -
Профиль   Отправить e-mail  

python sqlite выборка сразу целого списка

warpson
sqlite3 размером в 40 Гиг - да быть того не может !
хоть и 1.5 года назад
Может он просто никогда не выполнял VACUUM?



————————–
Истина где-то рядом

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version