diff --git a/swh/storage/db.py b/swh/storage/db.py --- a/swh/storage/db.py +++ b/swh/storage/db.py @@ -751,12 +751,12 @@ """ cur = self._cursor(cur) - query = """SELECT %s - FROM person - WHERE id IN %%s""" % ', '.join(self.person_get_cols) + query = """SELECT %s FROM (VALUES %%s) as t(id) + LEFT JOIN person ON t.id = person.id + """ % ','.join('person.' + col for col in self.person_get_cols) - cur.execute(query, (tuple(ids),)) - yield from cur + yield from execute_values_generator( + cur, query, ((id,) for id in ids)) release_add_cols = [ 'id', 'target', 'target_type', 'date', 'date_offset', diff --git a/swh/storage/tests/test_storage.py b/swh/storage/tests/test_storage.py --- a/swh/storage/tests/test_storage.py +++ b/swh/storage/tests/test_storage.py @@ -1633,21 +1633,28 @@ actual_persons = self.storage.person_get([id0, id1]) # then - self.assertEqual( - list(actual_persons), [ - { - 'id': id0, - 'fullname': person0['fullname'], - 'name': person0['name'], - 'email': person0['email'], - }, - { - 'id': id1, - 'fullname': person1['fullname'], - 'name': person1['name'], - 'email': person1['email'], - } - ]) + expected_persons = [ + { + 'id': id0, + 'fullname': person0['fullname'], + 'name': person0['name'], + 'email': person0['email'], + }, + { + 'id': id1, + 'fullname': person1['fullname'], + 'name': person1['name'], + 'email': person1['email'], + } + ] + self.assertEqual(list(actual_persons), expected_persons) + + # when + actual_persons = self.storage.person_get([id1, id0]) + + # then + expected_persons.reverse() + self.assertEqual(list(actual_persons), expected_persons) def test_person_get_fullname_unicity(self): # given (person injection through revisions for example)