首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@commit_manually中的嵌套@commit_on_success

@commit_manually中的嵌套@commit_on_success
EN

Stack Overflow用户
提问于 2012-03-26 17:15:50
回答 3查看 737关注 0票数 1

我在几个脚本中使用了以下实用函数:

代码语言:javascript
复制
@transaction.commit_on_success
def save_something(arg):
    # creation of a model_instance using arg
    model_instance.save()

在其中一个脚本中,我将大量这样的模型信息上传到数据库。为了提高效率,我尝试这样做:

代码语言:javascript
复制
@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

如果没有,我怎么能做到呢?

EN

回答 3

Stack Overflow用户

发布于 2012-03-29 01:59:23

看看这段代码,我认为它以一种更好的方式处理嵌套提交http://djangosnippets.org/snippets/1343/

票数 1
EN

Stack Overflow用户

发布于 2012-03-26 17:41:28

简短的回答是“不”和“你不能”。装饰器(以及它们真正能做的所有事情)是将它们装饰的函数包装在另一个函数中,该函数在必要时启动一个事务,然后调用原始函数。这就是commit_manually装饰器的包装器函数所做的全部工作。commit_on_success装饰器根据包装函数的成功情况添加自动提交或回滚。装饰器不是被切换的“运行时标志”和其他行为,然后关键字关闭。它们只是一个包裹在函数周围的小样板,commit_on_success装饰器的样板总是要么提交要么回滚。

装饰器的源码可以告诉你更多关于手头的细节:https://code.djangoproject.com/svn/django/trunk/django/db/transaction.py

票数 0
EN

Stack Overflow用户

发布于 2012-03-26 17:44:24

您可以:

代码语言:javascript
复制
@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()...

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9869456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档