在Django 1.5.x中,我有一個很長的運行管理命令,其中select查詢返回陳舊的數據。我懷疑這是由於它們在db連接的早期啓動的事務中運行的事實。有沒有一種方法可以告訴查詢是在事務中運行還是處於自動提交模式?如何判斷您的選擇查詢是否在事務中?
(這是一個較早的問題,我張貼在https://stackoverflow.com/questions/18540099/orm-does-not-return-recent-database-changes的有些更注重版)
在Django 1.5.x中,我有一個很長的運行管理命令,其中select查詢返回陳舊的數據。我懷疑這是由於它們在db連接的早期啓動的事務中運行的事實。有沒有一種方法可以告訴查詢是在事務中運行還是處於自動提交模式?如何判斷您的選擇查詢是否在事務中?
(這是一個較早的問題,我張貼在https://stackoverflow.com/questions/18540099/orm-does-not-return-recent-database-changes的有些更注重版)
您可以檢查,如果你是在一個事務中通過檢查is_managed
if transaction.is_managed():
print "tutsi frutsi!"
由於Django的1.7,你可以告訴我們,如果您通過transaction.get_autocommit API處於自動提交模式。
from django.db import transaction
if transaction.get_autocommit():
pass # We are in autocommit
由於Django的1.7,Connection.in_atomic_block
會告訴你,如果一個連接是內部交易或不。它似乎並不像這個是記錄,但它的作品在我的機器:
cxn = transaction.get_connection()
if cxn.in_atomic_block:
print "We're inside a transaction!"
https://docs.djangoproject.com/en/dev/internals/deprecation/ is_manged()將在Django 1.8中刪除。不幸的是,另一種選擇是未知的:https://code.djangoproject.com/ticket/21004 – guettli