Как проверить, что в базе данных, доступной через django-доступ, ничего не изменилось?

Я рефакторую некоторый код и добавляю блок atomic.transaction. У нас есть код, который выполняет автообновление по очереди, после атомарного блока. (Он не может быть в атомарном блоке, потому что он обращается к некоторым таблицам, связанным со многими данными, что требует запросов, поскольку ORM не хранит отличительные отношения).

Согласно моему прочтению кода, кажется невозможным, что какие-либо изменения могут произойти, но наличие теста для доказательства этого было бы неплохо на случай, если кто-то в будущем внесет неудачные правки в код.

Итак, как мне написать тест, который докажет, что ничего в базе данных не изменилось между началом теста и его окончанием?

Базой данных является postgres. В настоящее время она настроена на 2 базы данных (собственно база данных и "проверочная" база данных, которую я создал после того, как мы обнаружили, что код загрузки имеет побочные эффекты в режиме сухой работы. Сейчас я нахожусь в середине рефактора, который исправил проблему побочных эффектов, и я только что добавил блок атомарных транзакций. Поэтому я хотел бы написать тест следующего содержания:

    def test_no_side_effects_in_dry_run_mode(self):
        orig_db_state = self.get_db_state()  # How do I write this?
        call_command(
            "load_animals_and_samples",
            animal_and_sample_table_filename=("data.xlsx"),
            dry_run=True,
        )
        post_db_state = self.get_db_state()  # How do I write this?
        self.assertNoDatabaseChange(orig_db_state, post_db_state, msg="Oops, database changed unexpectedly.")  # How do I write this?

Ранее я уже писал тест, который сохраняет подсчеты всех записей в каждой таблице и сохраняет их в dict, а затем сравнивает dicts, но это не учитывает изменения полей в записи, и это то, что я хотел бы проверить. Кроме того, не хватает дополнительной вставки/удаления.

Так есть ли файл LMD, который я могу проверить, изменилось ли что-нибудь в базе данных?

Вернуться на верх