【问题标题】:django Postgres IntegrityErrordjango Postgres IntegrityError
【发布时间】:2009-08-20 11:28:56
【问题描述】:

有人可以向我解释如何正确测试 Postgres DB 错误,尤其是 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 的工作方式,好的。我在文档中看到我可以使用 transaction.rollback() 但在哪里:在测试或 save() 方法中?

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

我正在使用 django 1.1

【问题讨论】:

    标签: django postgresql


    【解决方案1】:

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

    【讨论】:

    • 好的,谢谢。所以在实时代码中,捕获 IntegrityError 后一切都会好起来的?还是应该明确地回滚到那里?
    • 您应该避免在您自己的代码中导致 IntegrityError,并将任何 SQL 错误视为错误。因此,您应该在尝试进行一些修改之前检查该修改是否合理。如果发现无法进行修改,可以回滚并向用户报告问题。或者您可以决定跳过修改,或者进行不同的修改。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-08-02
      • 2012-06-20
      • 2012-08-06
      • 2021-12-25
      • 2015-05-31
      • 1970-01-01
      • 2017-03-17
      • 2018-03-18
      相关资源
      最近更新 更多