Django测试postgres - 重置序列

时间:2017-05-10 12:55:46

标签: django postgresql unit-testing

到目前为止,已经在SQLite上进行了开发和测试,而在Postgres上进行了生产。现在一切都需要在Postgres上运行,并且大量的测试都破了。原因是,每个测试的ID不是从1开始,而是在测试之间继续。

解决此问题的一种方法是使用TransactionTestCase,因此更改

class FooCase(APITestCase):

class FooCase(APITransactionTestCase):
    reset_sequences = True 

这有效,但它变慢了

虽然我可以尝试修复测试,但这很困难,因为许多测试都有模拟方法。还有另一种方法,我可以重置序列并保持快速和整洁吗?

1 个答案:

答案 0 :(得分:1)

您可以在使用sql:

进行测试之前重置序列
SELECT setval(sequence_name, 1), sequence_name FROM information_schema.sequences;

但请记住以下内容:

SELECT currval('my_sequence'); --Returns 1
SELECT nextval('my_sequence'); --Returns 2

因此,如果您直接在代码上调用nextval,则序列将返回2而不是1。

此外,postgres中的序列就像表格。

SELECT last_value FROM my_sequence; --Returns 1

但是这种方法绕过currval ACID保护,这意味着并发安全。