2014-01-16 30 views
8

私は今非常に混乱しています。私はDjangoのスクリプトを実行して、偽のデータベースを作成し、同じコードを何度も繰り返し見回していました。私は次のエラーを取得するとき、私はすでに2,500以上のオブジェクトを作成していた:Djangoエラーが発生することがあります

ProgrammingError: autocommit cannot be used inside a transaction 

私はそれを見て、明らかに固定されているバグのチケットを得たが、それは私がDjangoの1.6を使用しています&過去のバージョン、のためでした。ここでは、完全なトレースバックがある:私は最初の2500個のオブジェクトに対して、この問題を持っていなかった場合

--------------------------------------------------------------------------- 
ProgrammingError       Traceback (most recent call last) 
<ipython-input-31-0597bce30f92> in <module>() 
----> 1 make_listeners() 

<ipython-input-29-5697f122e144> in make_listeners() 
    28       seed = random.randint(0,len(user_ids_copy)-1) 
    29       requested_user = user_ids_copy.pop(seed) 
---> 30       user.functions.listen_to(requested_user) 
    31       print i, user.pk, number_seed, original_seed 
    32       number_seed -= 1 

.../models.py in listen_to(self, user_id) 
    715     except User.DoesNotExist: 
    716       return 'User DoesNotExist' 
--> 717     request = ListenerRequest.objects.get_or_create(user=requesting, user_requested=requester, is_active=True) 
    718     if not request[1]: 
    719       if request.is_accepted: 

/Library/Python/2.7/site-packages/Django-1.6-py2.7.egg/django/db/models/manager.pyc in get_or_create(self, **kwargs) 
    152 
    153  def get_or_create(self, **kwargs): 
--> 154   return self.get_queryset().get_or_create(**kwargs) 
    155 
    156  def create(self, **kwargs): 

/Library/Python/2.7/site-packages/Django-1.6-py2.7.egg/django/db/models/query.pyc in get_or_create(self, **kwargs) 
    378     obj = self.model(**params) 
    379     with transaction.atomic(using=self.db): 
--> 380      obj.save(force_insert=True, using=self.db) 
    381     return obj, True 
    382    except DatabaseError: 

/Library/Python/2.7/site-packages/Django-1.6-py2.7.egg/django/db/transaction.pyc in __exit__(self, exc_type, exc_value, traceback) 
    328      connection.autocommit = True 
    329     else: 
--> 330      connection.set_autocommit(True) 
    331    # Outermost block exit when autocommit was disabled. 
    332    elif not connection.savepoint_ids and not connection.commit_on_exit: 

/Library/Python/2.7/site-packages/Django-1.6-py2.7.egg/django/db/backends/__init__.pyc in set_autocommit(self, autocommit) 
    331   self.validate_no_atomic_block() 
    332   self.ensure_connection() 
--> 333   self._set_autocommit(autocommit) 
    334   self.autocommit = autocommit 
    335 

/Library/Python/2.7/site-packages/Django-1.6-py2.7.egg/django/db/backends/postgresql_psycopg2/base.pyc in _set_autocommit(self, autocommit) 
    171  def _set_autocommit(self, autocommit): 
    172   if self.psycopg2_version >= (2, 4, 2): 
--> 173    self.connection.autocommit = autocommit 
    174   else: 
    175    if autocommit: 

ProgrammingError: autocommit cannot be used inside a transaction 

は、なぜ私はこのエラーを取得していますか?

モデル:要求されたように、そのエラーの原因となっているように見えるので、

、ここListenerRequestのモデルである:

class ListenerRequest(models.Model): 
    listener_relationship_id = models.AutoField(primary_key=True) 
    #user is the person asking to listen 
    user = models.ForeignKey(User, related_name='requests') 
    #user_requested is the person being asked to be listen to 
    user_requested = models.ForeignKey(User, related_name='requested') 
    date_requested = models.DateTimeField(auto_now_add=True) 
    date_accepted = models.DateTimeField(null=True,blank=True) 
    denied_flag = models.BooleanField(default=False) 
    denied_date = models.DateTimeField(null=True,blank=True) 
    unlistened_flag = models.BooleanField(default=False) 
    unlistened_date = models.DateTimeField(null=True,blank=True) 
    is_active = models.BooleanField(default=True) 
    is_accepted = models.BooleanField(default=False) 
+0

データベースとそのバージョンについて教えてください。 –

+0

postgres 9.3 –

+1

_models.py_でコードを確認すると便利です。 'get_or_create()'は他のオブジェクトを変更している間にオブジェクトを作成しようとしていますか? – Rohan

答えて

1

偽のデータベースを作成しようとする前に、次のことを試してください。

from django.db import connection 
curs = connection.cursor() 
curs.execute('SET autocommit = 1') 
5

django_postgrespoolを使用している場合、現在のバージョン(書いている時点)はエラーを飲み込んで、一般的なエラー "Programm ingError:トランザクション内で自動コミットを使用できません "。

あなたは

DATABASES['default']['ENGINE'] = 'django_postgrespool' 

一時的にあなたのsettings.pyに次の行をコメントアウトすることにより、実際のエラーを見ることができます詳細については、この現在開いている問題を参照してください:https://github.com/kennethreitz/django-postgrespool/issues/24

1

thisを参照してください。 Django 1.3python-psycopg2 2.4.2 (oneiric version)の間に互換性がありません。推奨される回避策は、python-psycopg2の以前のバージョンを使用するか、djangoトランクにアップデートすることです。これは、次のリリースには含まれないため、AFAICTはまだリリースされていません。

お試しください:sudo pip install psycopg2==2.4.1

関連する問題