django Postgres IntegrityError

时间:2009-08-20 11:28:56

标签: django postgresql

有人可以向我解释如何正确测试Postgres数据库错误,尤其是IntegrityError。例如,我有下一个测试:

class TestSlugs(TestCase):
    # This slug must be unique
    b = BookPublisher(slug=self.duplicate_slug)
    self.assertRaises(IntegrityError, b.save)

    #check if there's only one BookPublisher
    self.assertEquals(BookPublisher.objects.count(), 1)

这里它捕获IntegrityError但是然后所有操作都会失败,因为这就是postgres的工作方式,好吧。我在docs中看到我可以使用transaction.rollback()但在哪里:在test或save()方法中?

另外,我不喜欢手工编写回滚的想法,为什么django不能尝试保存,如果失败了 - 给我IntegrityError让我继续工作。

我正在使用django 1.1

2 个答案:

答案 0 :(得分:2)

不是100%确定这是有效的,但你可以这样做:

def save(self):
    transaction.commit()
    try:
        super(MyModel, self).save()
    except IntegrityError:
        transaction.rollback()
    else:
        transaction.commit()

答案 1 :(得分:2)

不要更改save()方法,因为您希望它在正常操作下传播。您应该在Test类中捕获异常并在那里回滚(请注意,因为您正在测试事务,所以必须继承TransactionalTestCase而不是普通的TestCase)。