Как создать генератор из объекта запроса SQLAlchemy - PullRequest
0 голосов
/ 07 марта 2020

Я работал над созданием сценария тестирования БД с использованием SQLAlchemy и pytest. Одним из тестов является построчное тестирование двух таблиц. Поскольку некоторые из рассматриваемых таблиц находятся в миллионах строк, я не могу просто использовать query (TableModel) .all (), так как он потребляет всю память.

Я пробовал обе с использованием yield и yield_per(), как показано ниже, но, похоже, не удалось найти правильный способ, позволяющий перебирать только несколько строк за раз:

def all_records(self):
    query = self.session.query(self.model_cls).yield_per(1000)
    return query
    # yield query

Вот тест:

def test_val_match(session, source, target):
    '''Verifies that the row values are the same in each table'''
    for s, t in zip(source.all_records(), target.all_records()):
        assert s == t

Оба эти результата приводят к использованию нескольких ГБ ОЗУ до тех пор, пока на машине не закончится память. Есть ли другой способ сделать это?

...