Django 1.8中的手动提交

时间:2015-04-23 18:51:32

标签: python django django-models

如何在Django 1.8中实现@commit_manually

我正在尝试升级Django 1.5代码以使用Django 1.8,并且由于一些奇怪的原因,在{xango 1.6}中移除了commit_manually装饰器而没有直接替换。我的进程遍历数千条记录,因此它不能将整个进程包装在单个事务中而不会耗尽内存,但仍需要在事务中对某些记录进行分组以提高性能。为此,我有一个用@commit_manually包装的方法,每N次迭代调用transaction.commit()。

我无法确定docs,但这似乎仍然得到支持。我只需要调用set_autocommit(False)而不是方便的装饰器。这是对的吗?

1 个答案:

答案 0 :(得分:7)

是的,你已经得到了它。致电set_autocommit(False)开始交易,然后致电commit()set_autocommit(True)提交。

你可以把它包装在你自己的装饰者中:

def commit_manually(fn):
    def _commit_manually(*args, **kwargs):
        set_autocommit(False)
        res = fn(*args, **kwargs)
        commit()
        set_autocommit(True)
        return res
    return _commit_manually