gpt4 book ai didi

python - Django 事务

转载 作者:行者123 更新时间:2023-11-30 23:39:24 30 4
gpt4 key购买 nike

我有一个代码,类似这样

def many_objects_saving(list_of_objects):
for some_object in list_of_objects:
# do smth with an object
some_object.save()

据我所知,django 每次在代码中到达 save() 时都会访问数据库。那么这里有两个问题:

  1. 如果我在另一个函数中使用这个函数并用 transaction.commit_on_successtransaction.commit_manually 装饰器包装它,django 会在一个事务中完成所有保存吗并减少对数据库的访问(在一个函数内)?

示例:

def resave_objects(model, condition):
list_of_objects = model.objects.filter(**condition)
many_objects_save(list_of_objects)

@transaction.commit_on_success
def many_objects_save(list_of_objects):
for some_object in list_of_objects:
# do smth with an object
some_object.save()

2.如果是这样,对于大型查询集会更好吗?谢谢大家!

最佳答案

所有保存都将包装到单个事务中,但不会包装到单个查询中。使用交易不会改变您进行的号码查询。

事务不是为了性能,而是为了数据完整性。如果你把你的 View 包装在一个事务中,并且在某个时刻失败了(也许中间的某些数据是错误的并且你无法从错误中恢复),那么有可能中止事务,并且事务中之前的查询都不会发生会对数据库产生任何影响。这样,您就可以确保失败的请求不会产生半生不熟的数据。

如果您的问题是大量保存的性能,您可以使用批量删除/创建方法。这是一个example of it in a project of mine 。这个想法是,您删除一个查询中的所有对象,然后在一个查询中重新创建所有新值。它不会在所有情况下都起作用,但它可能会起作用。

关于python - Django 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13601693/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com