加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Django为Postgresql创建了测试数据库,其序列起始值不正确

发布时间:2020-12-20 13:28:26 所属栏目:Python 来源:网络整理
导读:使用pyscopg2,作为Django数据库的默认后端,并用非常简单的情况进行测试.它尝试创建具有IntegrityError异常的用户失败 $python manage.py test project.core.testsnosetests --verbosity 1 project.core.tests --rednoseCreating test database for alias 'de
使用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.

默认数据库正在运行,可以添加用户.测试数据库上的测试失败了.

查看测试数据库,我看到所有表的主键的自动递增序列具有错误的起始值,它将默认数据库中最后使用的值作为测试数据库上的起始值.

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

我怎样才能解决这个问题?所以我的测试可以重新开始工作了.

解决方法

如果您没有在每次测试中重新创建数据库,那么您必须自己重置序列.

另外,我认为在使用db工具运行测试后检查db时发现了您发布的序列定义.在这种情况下,我认为您的数据库工具正在向您展示SQL,以便按原样创建序列:在使用它之后.

它在sqlite上没有发生的事实与默认情况下使用内存数据库有关.因此,它在每次测试运行中都会重新创建.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读