我有两张桌子:Person&团队;每个都与另一个有很多对多的关系。
我在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)
似乎删除并没有真正删除第一次的行。我无法弄清楚为什么会这样。
答案 0 :(得分:0)
正在删除Person
和Team
表中的行,但关联表中的行不会被删除。这是因为query.delete()
不处理关系级联。有关详细说明,请参阅Python's SQLAlchemy doesn't clean out the secondary (many-to-many) table?。
您应该可以使用session.delete(obj)
为已添加的每个对象解决此问题。或者更好的是,对于使用内存数据库的单元测试,只需在tearDown
和setUp
期间删除并重新创建所有表。