Django TemplateSyntaxError: 当前事务已中止,这个异常是什么意思?PostgreSQL 8.4能正常与Django一起使用吗?
错误的完整信息是:
模板语法错误在 /
渲染时捕获到异常: 当前事务已中止, 命令在事务块结束之前被忽略
我最近重新安装了电脑上的所有软件。之前这段代码运行得很好。现在在我朋友的电脑和开发服务器上也没有问题。
我能想到的唯一变化是postgresql服务器的版本(我不太确定之前的安装是否用的是8.4版本 - 但肯定在8.3上是可以工作的)。有没有人能确认Django在postgresql 8.4上是否有问题,或者有没有什么提示可以解释我为什么会遇到这些错误?
编辑 1
回应Dominic... 这个问题不仅仅出现在一个页面或一个标签上(虽然有些页面似乎没问题)。导致错误的标签和变量的共同点是,它们在某个环节访问了数据库(不过并不是所有访问数据库的标签都会导致错误)。而且,同样的代码在其他电脑上不会产生模板语法错误。
如果我删除了导致错误的变量或自定义模板标签,接下来会发生以下事情:
- 我删除了那个 supposedly 导致错误的变量或标签,然后刷新页面。
- Django会选择一个不同的变量或标签,然后出现同样的错误,所以我继续删除它们。
- 一旦所有导致错误的变量和标签都被删除,我就不再看到正常的错误页面。取而代之的是一张空白的白页,上面有以下的追踪信息:
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时,事务的处理方式可能会有一些需要注意的地方。可以看看这里的内容:
简单来说,通常的做法是通过添加以下内容来开启数据库级别的自动提交:
'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
。接着刷新页面,你应该能在日志文件中看到错误信息。