python - Django 1.6 对大量模型对象的事务管理

标签 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
}

现在我想做的是改变:
(Foo 1) 的名称
(Foo 2) 的别名
(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 更新模型对象列表。所以我循环遍历列表,就像

for update_this in bulky: update_this.save()

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

那么,使用 transaction.atomic() 会对我有所帮助,对吧?
它将以autocommit = 0开始,并在循环退出提交到数据库?

对于 celery ,我想在达到软时间限制之前使用sid来保存对象。这会是一个好的策略吗?

最佳答案

使用bulk_update_decorated版本。但据我了解,您不需要对保存点执行某些操作。只需从函数返回,整个事务就会被提交。

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

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

关于python - Django 1.6 对大量模型对象的事务管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28992662/

相关文章:

python - 我仍然可以在 Python 中使用 ChromeOptions 指定 chromedriver 的路径吗?

python - 首先按特定字段值排序 pyspark

mysql 触发器在 wamp 服务器上不起作用

django - Mercurial忽略pytharm的 “.idea”文件夹形式吗?

Django 不反射(reflect)对应用程序所做的更改

django - 如何计算 Django 中 PostgreSQL 数据库的行数?

python - 为什么我会收到错误消息:OpenCV(4.2.0)C:\projects\opencv-python\opencv\modules\highgui\src\window.cpp:376:错误:

Python Pandas,删除 NaN

python - 使用 python 导入我的数据库连接

mysql - Worklight 应用程序和 "cloud"MySQL 数据库之间进行通信