簡體   English   中英

Django TemplateSyntaxError:當前事務被中止,這個異常是什么意思? postgresql 8.4與django一起工作正常嗎?

[英]Django TemplateSyntaxError: current transaction is aborted, what does this exception mean? Does postgresql 8.4 work fine with django?

錯誤的全文是:

在/的TemplateSyntaxError

渲染時捕獲異常:當前事務被中止,命令被忽略直到事務塊結束

我最近重新安裝了計算機上的所有軟件。 以前用過的代碼沒問題。 它在朋友的計算機和開發服務器上仍然沒有問題。

我唯一能想到的,可能已經改變的是postgresql服務器版本(我實際上並不確定我是否嘗試在我的舊安裝上運行8.4或者沒有 - 它絕對適用於8.3)。 有人能夠確認Django有postgresql 8.4的問題和/或有任何提示,為什么我有這些錯誤?

編輯1

為了回應Dominic ......這不僅僅發生在一個頁面或一個標簽上(雖然有些頁面似乎沒問題)。 導致錯誤的標簽和變量的唯一共同點是它們碰巧在途中的某個地方訪問數據庫(盡管並非所有訪問數據庫的標簽都會導致錯誤)。 此外,相同的代碼不會在其他計算機上創建TemplateSyntaxError。

如果我刪除了發生錯誤的變量或自定義模板標記,那么這就是發生的事件鏈:

  1. 我刪除了導致錯誤並刷新頁面的變量或標記。
  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

該異常意味着某些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 然后刷新頁面。 您應該會在日志文件中看到錯誤。

如果您從不同的數據庫遷移,請注意Django與Postgres使用事務的方式可能需要考慮一些因素。 在這里閱讀:

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

快速回答通常是通過添加以下命令打開數據庫級自動提交:

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

到你的數據庫設置。 但值得仔細閱讀並了解首席執行官。

羅洛。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM