Use batches of 999 for get_things_by_id.
SQLite has a limit on how many variables you can use per query.
This commit is contained in:
parent
97e1f881d0
commit
fa97512586
1 changed files with 8 additions and 7 deletions
|
@ -1455,22 +1455,23 @@ class PhotoDB(
|
||||||
thing_cache = self.caches[thing_type]
|
thing_cache = self.caches[thing_type]
|
||||||
|
|
||||||
ids_needed = set()
|
ids_needed = set()
|
||||||
things = set()
|
|
||||||
for thing_id in thing_ids:
|
for thing_id in thing_ids:
|
||||||
try:
|
try:
|
||||||
thing = thing_cache[thing_id]
|
thing = thing_cache[thing_id]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
ids_needed.add(thing_id)
|
ids_needed.add(thing_id)
|
||||||
else:
|
else:
|
||||||
things.add(thing)
|
yield thing
|
||||||
|
|
||||||
yield from things
|
ids_needed = list(ids_needed)
|
||||||
|
while ids_needed:
|
||||||
|
# SQLite3 has a limit of 999 ? in a query, so we must batch them.
|
||||||
|
id_batch = ids_needed[:999]
|
||||||
|
ids_needed = ids_needed[999:]
|
||||||
|
|
||||||
if ids_needed:
|
qmarks = '(%s)' % ','.join('?' * len(id_batch))
|
||||||
qmarks = '(%s)' % ','.join('?' * len(ids_needed))
|
|
||||||
query = 'SELECT * FROM %s WHERE id IN %s' % (thing_map['table'], qmarks)
|
query = 'SELECT * FROM %s WHERE id IN %s' % (thing_map['table'], qmarks)
|
||||||
bindings = list(ids_needed)
|
more_things = self.sql_select(query, id_batch)
|
||||||
more_things = self.sql_select(query, bindings)
|
|
||||||
for thing_row in more_things:
|
for thing_row in more_things:
|
||||||
thing = thing_map['class'](self, db_row=thing_row)
|
thing = thing_map['class'](self, db_row=thing_row)
|
||||||
thing_cache[thing.id] = thing
|
thing_cache[thing.id] = thing
|
||||||
|
|
Loading…
Reference in a new issue