使用pyscopg2,作为Django数据库的默认后端,并且具有非常简单的测试用例。它无法尝试使用 IntegrityError 例外
创建用户$ python manage.py test project.core.tests
nosetests --verbosity 1 project.core.tests --rednose
Creating test database for alias 'default'...
X.
-----------------------------------------------------------------------------
1) ERROR: Tests that a user with a sha1 hashed password is change to newer hash method
Traceback (most recent call last):
crowddeals/core/tests.py line 7 in setUp
self.user1 = User.objects.create_user('user1', 'user1@domain.com')
env/lib/python2.7/site-packages/django/contrib/auth/models.py line 160 in create_user
user.save(using=self._db)
env/lib/python2.7/site-packages/django/db/models/base.py line 477 in save
force_update=force_update, update_fields=update_fields)
env/lib/python2.7/site-packages/django/db/models/base.py line 572 in save_base
result = manager._insert([self], fields=fields, return_id=update_pk, using=using, raw=raw)
env/lib/python2.7/site-packages/django/db/models/manager.py line 203 in _insert
return insert_query(self.model, objs, fields, **kwargs)
env/lib/python2.7/site-packages/django/db/models/query.py line 1588 in insert_query
return query.get_compiler(using=using).execute_sql(return_id)
env/lib/python2.7/site-packages/django/db/models/sql/compiler.py line 911 in execute_sql
cursor.execute(sql, params)
env/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py line 52 in execute
return self.cursor.execute(query, args)
IntegrityError: duplicate key value violates unique constraint "auth_user_pkey"
DETAIL: Key (id)=(1) already exists.
默认数据库正常运行,可以添加用户。测试仅在 test 数据库上失败。
查看 test 数据库,我看到所有表的主键的自动递增序列具有错误的起始值,它从默认值数据库作为 test 数据库的起始值。
对于默认数据库,User.id使用自动增量序列。
CREATE SEQUENCE auth_user_id_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1;
并为测试数据库创建
CREATE SEQUENCE auth_user_id_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 2
CACHE 1;
这显然是错误的,这也发生在其他表上,作为权限。
CREATE SEQUENCE auth_permission_id_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 191
CACHE 1;
我无法猜测为什么会发生这种情况,它必须从1开始在新的测试数据库上创建序列。
如果我将数据库引擎后端更改为sqlite3,则不会发生异常。这只发生在postgresql中。
我该如何解决这个问题?所以我的测试可以重新开始工作了。
答案 0 :(得分:1)
如果您没有在每次测试中重新创建数据库,那么您必须自己重置序列。
另外,我认为在使用db工具运行测试后检查数据库时发现了您发布的序列定义。在这种情况下,我认为您的数据库工具正在向您展示SQL,以便按原样创建序列:在使用它之后。
在sqlite上没有发生的事实与默认情况下使用内存数据库有关。因此,它会在每次测试运行中重新创建。