【问题标题】:django.db.utils.DatabaseErrordjango.db.utils.DatabaseError
【发布时间】:2010-12-26 05:34:24
【问题描述】:

我正在设置一个 django 模型来存储区域,例如美国、德国等。我为表设置了唯一的区域名称。我有一个从列表中填充数据库的脚本,如果有重复的区域名称 IntegrityError 按预期抛出,但随后发生另一个错误,我无法从错误消息中判断原因。有任何想法吗?谢谢!

django.db.utils.DatabaseError: current transaction is aborted, commands ignored until end of transaction block

型号:

class Region(models.Model):
    name = models.CharField(max_length=512, unique=True)

    def __unicode__(self):
        return self.name

填充代码:

    try:
        Region(name=server['locale']).save()
        print 'Added region: %(locale)s' % server
    except IntegrityError:
        pass

我已经确认 IntegrityError 正在发生,但随后我收到了这个我没想到的错误:

  File "/home/daedalus/webapps/wowstatus/lib/python2.6/django/db/models/base.py", line 456, in save
    self.save_base(using=using, force_insert=force_insert, force_update=force_update)
  File "/home/daedalus/webapps/wowstatus/lib/python2.6/django/db/models/base.py", line 549, in save_base
    result = manager._insert(values, return_id=update_pk, using=using)
  File "/home/daedalus/webapps/wowstatus/lib/python2.6/django/db/models/manager.py", line 195, in _insert
    return insert_query(self.model, values, **kwargs)
  File "/home/daedalus/webapps/wowstatus/lib/python2.6/django/db/models/query.py", line 1518, in insert_query
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/home/daedalus/webapps/wowstatus/lib/python2.6/django/db/models/sql/compiler.py", line 788, in execute_sql
    cursor = super(SQLInsertCompiler, self).execute_sql(None)
  File "/home/daedalus/webapps/wowstatus/lib/python2.6/django/db/models/sql/compiler.py", line 732, in execute_sql
    cursor.execute(sql, params)
  File "/home/daedalus/webapps/wowstatus/lib/python2.6/django/db/backends/util.py", line 15, in execute
    return self.cursor.execute(sql, params)
  File "/home/daedalus/webapps/wowstatus/lib/python2.6/django/db/backends/postgresql_psycopg2/base.py", line 44, in execute
    return self.cursor.execute(query, args)
django.db.utils.DatabaseError: current transaction is aborted, commands ignored until end of transaction block

【问题讨论】:

    标签: python django


    【解决方案1】:

    如果出现故障,您应该重置您的数据库状态 例如:

    from django.db import transaction
    
    @transaction.commit_manually
    def Populate():
        try:
            Region(name=server['locale']).save()
            print 'Added region: %(locale)s' % server
        except IntegrityError:
            transaction.rollback()
        else:
            transaction.commit()
    

    【讨论】:

    • +1,它帮助我解决了一个问题。只是一个小技巧:我必须在渲染模板后提交/回滚事务。
    【解决方案2】:

    从 django shell 访问数据库时,有时会出现此错误。我通过关闭连接来修复它:

    from django.db import connection
    connection.close()
    cur = connection.cursor()
    sql = 'select distinct category from uploads_document'
    cur.execute(sql)
    

    在我犯了“select dissinct ..”之类的错误之后

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      • 2019-06-29
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      • 2018-10-09
      • 2021-05-18
      相关资源
      最近更新 更多