<p>您可以按如下方式对<code>sql_flush</code>进行monkey-patch,以重置SQLite序列:</p>
<pre class="lang-py prettyprint-override"><code>from django.db.backends.sqlite3.operations import DatabaseOperations
from django.db import connection
def _monkey_patch_sqlite_sql_flush_with_sequence_reset():
original_sql_flush = DatabaseOperations.sql_flush
def sql_flush_with_sequence_reset(self, style, tables, sequences, allow_cascade=False):
sql_statement_list = original_sql_flush(self, style, tables, sequences, allow_cascade)
if tables:
# DELETE FROM sqlite_sequence WHERE name IN ($tables)
sql = '%s %s %s %s %s %s (%s);' % (
style.SQL_KEYWORD('DELETE'),
style.SQL_KEYWORD('FROM'),
style.SQL_TABLE(self.quote_name('sqlite_sequence')),
style.SQL_KEYWORD('WHERE'),
style.SQL_FIELD(self.quote_name('name')),
style.SQL_KEYWORD('IN'),
', '.join(style.SQL_FIELD(f"'{table}'") for table in tables)
)
sql_statement_list.append(sql)
return sql_statement_list
DatabaseOperations.sql_flush = sql_flush_with_sequence_reset
</code></pre>
<p>例如在<code>TransactionTestCase</code>中使用它:</p>
^{pr2}$
<p>这可以确保依赖于固定主键的测试同时适用于SQLite和其他数据库后端(如PostgreSQL)。但是,有关<code>reset_sequences</code>的注意事项,请参见<a href="https://docs.djangoproject.com/en/1.11/topics/testing/advanced/#django.test.TransactionTestCase.reset_sequences" rel="nofollow noreferrer">Django documentation</a>。一方面,它使测试变慢。在</p>