2012-06-09 34 views
4

使用pyscopg2作爲Django數據庫默認後端,並且測試非常簡單。它沒有試圖建立一個用戶,具有IntegrityError例外Django使用不正確的序列起始值創建Postgresql的測試數據庫

$ 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', '[email protected]') 
    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中。

我該如何解決這個問題?所以我的測試可以再次開始工作。

+0

在運行每個測試之前清除數據庫嗎? –

+0

如果您的意思是測試數據庫,則在運行測試時不會創建。 –

回答

1

如果你不用每次測試重新創建數據庫,那麼你必須自己重置序列。

另外,我認爲在使用db工具運行測試之後檢查數據庫時發現了您發佈的序列定義。在這種情況下,我認爲你的數據庫工具向你展示了創建序列的SQL:在它被使用之後。

它沒有發生在sqlite上的事實與默認情況下使用內存中的db有關。因此,它在每次測試中都會重新創建。

相關問題