Django 1.8中的手动提交

Cer*_*rin 4 python django django-models

你如何@commit_manually在Django 1.8中实现?

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

我无法从文档中确切地说出来,但这似乎仍然得到了支持.我只需要打电话set_autocommit(False)而不是有一个方便的装饰.它是否正确?

mip*_*adi 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
Run Code Online (Sandbox Code Playgroud)