Найти - Пользователи
Полная версия: python sqlite выборка сразу целого списка
Начало » Базы данных » python sqlite выборка сразу целого списка
1
valet
Есть список 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
Разобрался сам , может кому-то пригодится, опубликую решение:
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 запрос - то есть выигрыш колосальный!
warpson
sqlite3 размером в 40 Гиг - да быть того не может !
хоть и 1.5 года назад :)
alexbadaloff
warpson
sqlite3 размером в 40 Гиг - да быть того не может !
хоть и 1.5 года назад
Может он просто никогда не выполнял VACUUM?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB