Вот версия, которую я наконец-то использую:
from sqlalchemy.sql.functions import count
from sqlalchemy.orm import subqueryload
# …
repeats = (
select(
(Item.identifier,
count(Item.identifier)))
.group_by(Item.identifier)
.having(count(Item.identifier) > 1)
.alias())
for identifier in (
sess.query(Identifier)
.join(repeats, repeats.c.identifier==Identifier.value)
.options(subqueryload(Identifier.items))
):
for item in identifier.items:
pass
(Идентификатор теперь сопоставляется с выбором и не поддерживается таблицей базы данных, что также делает импорт немного быстрее)