[英]nested @commit_on_success in @commit_manually
我在幾個腳本中使用以下實用程序功能:
@transaction.commit_on_success
def save_something(arg):
# creation of a model_instance using arg
model_instance.save()
在其中一個腳本中,我將許多這些模型實例上傳到數據庫。 為了提高效率,我嘗試執行以下操作:
@transaction.commit_manually
def save_many(arg_list):
for i,arg in enumerate(arg_list):
save_something(arg)
if i%1000==0:
transaction.commit()
commit_manually
是否覆蓋commit_on_success
?
如果沒有,我該怎么做?
看看這個片段,我認為它以更好的方式處理嵌套的提交http://djangosnippets.org/snippets/1343/
簡短的回答是“否”和“您不能”。 裝飾器(及其所做的全部工作)將它們裝飾的函數包裝在另一個函數中,該函數在必要時啟動事務,然后調用原始函數。 這就是commit_manually
裝飾器的包裝器函數所做的全部。 commit_on_success
裝飾器根據包裝函數的成功添加自動提交或回滾。 裝飾器不是被切換的“運行時標志”,而是其他行為被禁用。 它們只是一個包裹在您的函數中的小樣板,並且commit_on_success
裝飾器的樣板將始終是提交或回滾。
裝飾者的來源可以告訴您更多有關手頭細節的信息: https : //code.djangoproject.com/svn/django/trunk/django/db/transaction.py
您可以:
@transaction.commit_on_success
def save_something(arg):
_save_something(arg)
def _save_something(arg):
# creation of a model_instance using arg
model_instance.save()
然后在確實需要它的免費裝飾器的情況下,使用_save_something()
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.