UnitTest: Невозможно добавить много ко многим отношениям: ошибка целостности (кажется, удаление не делает его работу)
У меня есть две таблицы: человек и команда; у каждого есть отношение "многие ко многим" с другим.
Я делаю это в setUp
функция (вызывается перед каждой функцией тестирования, 3 раза в моем случае)
p = Person(fname=u"John", lname=u"Doe")
Team(name=u"Anon", persons=[p])
session.commit()
И мой tearDown
функция (вызывается после каждой функции тестирования)
Person.query.delete()
Team.query.delete()
session.commit()
Первый тест проходит, но когда setUp
называется второй раз, я получил это:IntegrityError: (IntegrityError) columns person_id, team_id are not unique u'INSERT INTO team_persons__person_teams (person_id, team_id) VALUES (?, ?)' (5, 1)
Кажется, что удаление не действительно удаляло строки в первый раз. Я не могу понять, почему это происходит.
1 ответ
Строки в вашем Person
а также Team
таблицы удаляются, а строка из таблицы сопоставления - нет. Это потому что query.delete()
не обрабатывает каскадные отношения. Видите , SQLAlchemy Python не очищает вторичную (многие-ко-многим) таблицу? для подробного объяснения.
Вы должны быть в состоянии решить эту проблему с помощью session.delete(obj)
для каждого объекта, который вы добавили. Или еще лучше, для модульного тестирования с базой данных в памяти, просто удалите и заново создайте все свои таблицы во время tearDown
а также setUp
,