4

Django データベースのデフォルトのバックエンドとして pyscopg2 を使用し、テスト用の非常に単純なケースを使用します。ユーザーの作成に失敗し、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でのみ発生します。

どうすればこれを修正できますか? 私のテストが再び機能し始めることができます。

4

1 に答える 1

1

すべてのテストでデータベースを再作成しない場合は、シーケンスを自分でリセットする必要があります。

また、ご投稿いただいたシーケンス定義は、db ツールでテストを実行した後に db を調べたところ見つかったものだと思います。その場合、あなたの db ツールは、シーケンスをそのまま作成するための SQL を提示していると思います: それが使用された後。

sqlite で発生しないという事実は、デフォルトでメモリ内データベースを使用することに関係しています。したがって、すべてのテスト実行で再作成されています。

于 2012-08-08T03:08:24.303 に答える