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] | ||||
| 
 | ||||
|         ids_needed = set() | ||||
|         things = set() | ||||
|         for thing_id in thing_ids: | ||||
|             try: | ||||
|                 thing = thing_cache[thing_id] | ||||
|             except KeyError: | ||||
|                 ids_needed.add(thing_id) | ||||
|             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(ids_needed)) | ||||
|             qmarks = '(%s)' % ','.join('?' * len(id_batch)) | ||||
|             query = 'SELECT * FROM %s WHERE id IN %s' % (thing_map['table'], qmarks) | ||||
|             bindings = list(ids_needed) | ||||
|             more_things = self.sql_select(query, bindings) | ||||
|             more_things = self.sql_select(query, id_batch) | ||||
|             for thing_row in more_things: | ||||
|                 thing = thing_map['class'](self, db_row=thing_row) | ||||
|                 thing_cache[thing.id] = thing | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue