【问题标题】:Django 1.6 Transaction Management on large list of Model Objects大量模型对象上的 Django 1.6 事务管理
【发布时间】:2015-05-13 14:23:04
【问题描述】:

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

为了正确理解这一点,

假设,我的模型名称 = 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 exit 将commit 到数据库?

对于 celery,我想在到达 soft time limit 之前使用 sid 来保存对象。这会是个好策略吗?

【问题讨论】:

    标签: python mysql django transactions


    【解决方案1】:

    使用bulk_update_decorated 版本。但据我了解,您不需要对保存点做任何事情。只需从函数返回,整个事务就会被提交。

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

    保存点用于部分回滚事务。您不执行任何回滚,因此在这里使用保存点毫无意义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-29
      • 2015-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      • 2016-01-06
      • 2014-01-08
      相关资源
      最近更新 更多