如何在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)
而不是方便的装饰器。这是对的吗?
答案 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