Django 使用不正确的序列起始值为 Postgresql 创建测试数据库

标签 django postgresql django-testing django-postgresql

使用 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 数据库上失败。

查看测试 数据库,我发现所有表的主键的自动递增序列都有错误的起始值,它从默认 数据库作为测试数据库的起始值。

对于默认数据库,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 中。

我该如何解决这个问题?这样我的测试就可以重新开始工作了。

最佳答案

如果您不在每次测试时重新创建数据库,那么您必须自己重置序列。

此外,我认为您发布的序列定义是在使用数据库工具运行测试后检查数据库时发现的。在这种情况下,我认为您的数据库工具会向您提供 SQL 以按原样创建序列:在使用之后。

它不会在 sqlite 上发生的事实与它默认使用内存数据库有关。因此,它会在每次测试运行时重新创建。

关于Django 使用不正确的序列起始值为 Postgresql 创建测试数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10963315/

相关文章:

python - Django 无法在数据库中保存表单

html - 无法在 Django 1.9 中加载 style.css

python - postgresql:致命:用户 "douglas"的密码验证失败

python - 在 virtualenv 中运行测试时 Django MySQL 错误

django - 静态文件不适用于 Django、Heroku 和 Django Sass 处理器

python - Django:迁移到 NullBooleanField 失败并出现 IntegrityError "contains null values"

database - psycopg2 - 类型错误 : 'int' object is not subscriptable

mysql - update_date NOT NULL 约束的数据库表设计最佳实践

django - 如何在 Django 中测试自定义模板标签?

django - 如何在Django单元测试中使用pdb.set_trace()?