Django 1.6交易管理大型模型对象列表

时间:2015-03-11 16:53:00

标签: python mysql django transactions

长问题:如果我需要遍历模型对象列表并单独保存,我不确定如何去做。

要正确理解这一点,

假设我的模型名称= Foo

示例:

Model Object :
f1 = Foo 1 {
name : foo,
alias : Fooo 1,
description : Fooo 1
}

f2 = Foo 2 {
name : foo_2,
alias : Fooo,
description : Fooo 2
}

f3 = Foo 3 {
name : foo_3,
alias : Fooo 3,
description : Fooo
}

现在我想做的是改变:
name for (Foo 1)
alias for (Foo 2)
description for (Foo 3)
然后通过循环手动执行更新(保存)每个对象的事务。

foo_list = list()

f1.name = 'foo_1'
foo_list.append(f1)

f2.alias = 'Foo 2'
foo_list.append(f2)

f3.description = 'Fooo 3'
foo_list.append(f3)
@task()
@transaction.atomic()
def bulk_update_decorated(bulky):
    """

    :param bulky: model object list
    :return: True
    """
    sid = None
    try:

        for update_this in bulky:
            update_this.save()            # transaction is having an element
            sid = transaction.savepoint()
        return True
    except SoftTimeLimitExceeded:
        transaction.savepoint_commit(sid) # on loop exit commit

@task()
def bulk_update_internal(bulky):
    """

    :param bulky: model object list
    :return: True
    """
    sid = None
    try:
        with transaction.atomic():
            for update_this in bulky:
                update_this.save()
                sid = transaction.savepoint()
    except SoftTimeLimitExceeded:
        transaction.savepoint_commit(sid) # on loop exit commit

以下哪项是首选方式(实际上可能有效)?

bulk_update_internal(foo_list)

OR

bulk_update_decorated(foo_list)

...............................................

我要保存/更新大量数据。

早些时候我正在循环并保存它们,但事实并非如此 看起来是个好主意。

不能使用update(),因为我想要每个数据点 存储不同的信息并单独保存。

编辑:预期用途

我打算通过使用CELERY更新list of model objects。所以我像

一样循环遍历列表
for update_this in bulky: update_this.save()

这意味着要为所有对象调用save方法,并且由于Django 1.6是自动提交,这意味着对象在循环中保存在数据库中。坏主意。

那么,using transaction.atomic()会对我有帮助吗? 它会从autocommit = 0开始,loop exitcommit到数据库吗?

对于芹菜我想在sid到达之前使用soft time limit来保存对象。这将是一个很好的策略?

1 个答案:

答案 0 :(得分:1)

使用bulk_update_decorated版本。但据我所知,你不需要用保存点做些什么。只需从函数返回,就会提交整个事务。

@transaction.atomic
def bulk_update_decorated(bulky):
    try:
        for update_this in bulky:
            update_this.save()
    except SoftTimeLimitExceeded:
        pass

保存点用于部分回滚事务。你不做任何回滚,所以使用保存点在这里没有任何意义。