Django TemplateSyntaxError: 当前事务已中止,这个异常是什么意思?PostgreSQL 8.4能正常与Django一起使用吗?

8 投票
2 回答
5283 浏览
提问于 2025-04-15 16:47

错误的完整信息是:

模板语法错误在 /

渲染时捕获到异常: 当前事务已中止, 命令在事务块结束之前被忽略

我最近重新安装了电脑上的所有软件。之前这段代码运行得很好。现在在我朋友的电脑和开发服务器上也没有问题。

我能想到的唯一变化是postgresql服务器的版本(我不太确定之前的安装是否用的是8.4版本 - 但肯定在8.3上是可以工作的)。有没有人能确认Django在postgresql 8.4上是否有问题,或者有没有什么提示可以解释我为什么会遇到这些错误?

编辑 1

回应Dominic... 这个问题不仅仅出现在一个页面或一个标签上(虽然有些页面似乎没问题)。导致错误的标签和变量的共同点是,它们在某个环节访问了数据库(不过并不是所有访问数据库的标签都会导致错误)。而且,同样的代码在其他电脑上不会产生模板语法错误。

如果我删除了导致错误的变量或自定义模板标签,接下来会发生以下事情:

  1. 我删除了那个 supposedly 导致错误的变量或标签,然后刷新页面。
  2. Django会选择一个不同的变量或标签,然后出现同样的错误,所以我继续删除它们。
  3. 一旦所有导致错误的变量和标签都被删除,我就不再看到正常的错误页面。取而代之的是一张空白的白页,上面有以下的追踪信息:
Traceback (most recent call last):

  File "/usr/lib/python2.6/site-packages/django/core/servers/basehttp.py", line 279, in run
    self.result = application(self.environ, self.start_response)

  File "/usr/lib/python2.6/site-packages/django/core/servers/basehttp.py", line 651, in __call__
    return self.application(environ, start_response)

  File "/usr/lib/python2.6/site-packages/django/core/handlers/wsgi.py", line 245, in __call__
    response = middleware_method(request, response)

  File "/usr/lib/python2.6/site-packages/debug_toolbar/middleware.py", line 90, in process_response
    response.content = replace_insensitive(smart_unicode(response.content), u'', smart_unicode(self.debug_toolbars[request].render_toolbar() + u''))

  File "/usr/lib/python2.6/site-packages/debug_toolbar/toolbar/loader.py", line 72, in render_toolbar
    'BASE_URL': self.request.META.get('SCRIPT_NAME', ''),

  File "/usr/lib/python2.6/site-packages/django/template/loader.py", line 108, in render_to_string
    return t.render(context_instance)

  File "/usr/lib/python2.6/site-packages/django/test/utils.py", line 29, in instrumented_test_render
    return self.nodelist.render(context)

  File "/usr/lib/python2.6/site-packages/django/template/__init__.py", line 779, in render
    bits.append(self.render_node(node, context))

  File "/usr/lib/python2.6/site-packages/django/template/debug.py", line 71, in render_node
    result = node.render(context)

  File "/usr/lib/python2.6/site-packages/django/template/defaulttags.py", line 155, in render
    nodelist.append(node.render(context))

  File "/usr/lib/python2.6/site-packages/django/template/defaulttags.py", line 243, in render
    return self.nodelist_true.render(context)

  File "/usr/lib/python2.6/site-packages/django/template/__init__.py", line 779, in render
    bits.append(self.render_node(node, context))

  File "/usr/lib/python2.6/site-packages/django/template/debug.py", line 81, in render_node
    raise wrapped

TemplateSyntaxError: Caught an exception while rendering: current transaction is aborted, commands ignored until end of transaction block


Original Traceback (most recent call last):
  File "/usr/lib/python2.6/site-packages/django/template/debug.py", line 71, in render_node
    result = node.render(context)
  File "/usr/lib/python2.6/site-packages/django/template/debug.py", line 87, in render
    output = force_unicode(self.filter_expression.resolve(context))
  File "/usr/lib/python2.6/site-packages/django/template/__init__.py", line 546, in resolve
    obj = self.var.resolve(context)
  File "/usr/lib/python2.6/site-packages/django/template/__init__.py", line 687, in resolve
    value = self._resolve_lookup(context)
  File "/usr/lib/python2.6/site-packages/django/template/__init__.py", line 722, in _resolve_lookup
    current = current()
  File "/usr/lib/python2.6/site-packages/debug_toolbar/panels/template.py", line 64, in content
    pformat(k(self.request))) for k in get_standard_processors()
  File "/usr/lib/python2.6/site-packages/django/core/context_processors.py", line 27, in auth
    'messages': user.get_and_delete_messages(),
  File "/usr/lib/python2.6/site-packages/django/contrib/auth/models.py", line 263, in get_and_delete_messages
    for m in self.message_set.all():
  File "/usr/lib/python2.6/site-packages/django/db/models/query.py", line 106, in _result_iter
    self._fill_cache()
  File "/usr/lib/python2.6/site-packages/django/db/models/query.py", line 692, in _fill_cache
    self._result_cache.append(self._iter.next())
  File "/usr/lib/python2.6/site-packages/django/db/models/query.py", line 238, in iterator
    for row in self.query.results_iter():
  File "/usr/lib/python2.6/site-packages/django/db/models/sql/query.py", line 287, in results_iter
    for rows in self.execute_sql(MULTI):
  File "/usr/lib/python2.6/site-packages/django/db/models/sql/query.py", line 2369, in execute_sql
    cursor.execute(sql, params)
  File "/usr/lib/python2.6/site-packages/debug_toolbar/panels/sql.py", line 91, in execute
    return self.cursor.execute(sql, params)
InternalError: current transaction is aborted, commands ignored until end of transaction block

2 个回答

4

如果你是从其他数据库迁移过来的,注意在使用Django和Postgres时,事务的处理方式可能会有一些需要注意的地方。可以看看这里的内容:

http://docs.djangoproject.com/en/dev/topics/db/transactions/?from=olddocs#handling-exceptions-within-postgresql-transactions

简单来说,通常的做法是通过添加以下内容来开启数据库级别的自动提交:

'OPTIONS': {'autocommit': True,}

到你的数据库设置中。不过,了解一下这个过程和相关的细节还是很有必要的。

Rolo.

13

这个异常意味着在执行某些SQL语句时出现了错误。因为Django会把所有的SQL语句放在一个数据库事务中运行,所以在错误发生后,后面的SQL语句都会被忽略。所以:

BEGIN;
SELECT * FROM table;
SELECT missing_column FROM table WHERE id = 1; -- generates an error because the column is missing
SELECT * FROM another_table; -- this statement and all following statements get ignored until the next COMMIT;
COMMIT;

要找出问题所在,你需要找到PostgreSQL的日志文件,然后运行 tail -f /path/to/postgresql_error.log。接着刷新页面,你应该能在日志文件中看到错误信息。

撰写回答