到目前为止,已经在SQLite上进行了开发和测试,而在Postgres上进行了生产。现在一切都需要在Postgres上运行,并且大量的测试都破了。原因是,每个测试的ID不是从1开始,而是在测试之间继续。
解决此问题的一种方法是使用TransactionTestCase
,因此更改
class FooCase(APITestCase):
带
class FooCase(APITransactionTestCase):
reset_sequences = True
这有效,但它变慢了
虽然我可以尝试修复测试,但这很困难,因为许多测试都有模拟方法。还有另一种方法,我可以重置序列并保持快速和整洁吗?
答案 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保护,这意味着并发安全。