Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
django:插入或更新大型对象列表的好方法_Django_Django Orm - Fatal编程技术网

django:插入或更新大型对象列表的好方法

django:插入或更新大型对象列表的好方法,django,django-orm,Django,Django Orm,看起来我在处理大型数据集时遇到了问题。假设我有以下情况: 1) 带有产品(每个产品具有唯一sku)的大型csv(200K+行)随post请求一起发送 2) 对于每个项目,我需要检查它是否已经在数据库中(我使用的是get_或_create) 3) 若对象存在,我会更新它,否则我会在数据库中创建一个新实体 代码如下所示: for csv_item in csv_products: product = Products.objects.get_or_create(sku=csv_item.sk

看起来我在处理大型数据集时遇到了问题。假设我有以下情况:

1) 带有产品(每个产品具有唯一sku)的大型csv(200K+行)随post请求一起发送 2) 对于每个项目,我需要检查它是否已经在数据库中(我使用的是get_或_create) 3) 若对象存在,我会更新它,否则我会在数据库中创建一个新实体

代码如下所示:

for csv_item in csv_products:
    product = Products.objects.get_or_create(sku=csv_item.sku)
    product.price = csv_item.price # Here I update all fields from csv_item
    product.save()
问题 这段代码对数据库造成了难以置信的冲击。查询量惊人,执行时间也非常长

我想说的是: 1) django的批量创建方法。为什么它不能很好地工作:我不仅需要创建,还需要更新。所以检查对象是否存在于第一步“断开批量创建”中。。。 2) 通过发送提交/回滚来手动控制事务。我不确定这里。。。它往往会给我带来错误


请告知…

您可能想考虑使用类似的任务队列,并将价格作为后台进程更新。这并没有减少查询的数量,但它确实意味着你可以快速地向用户返回一个回复,上面写着“谢谢上传,价格会更新”。是的,我在考虑这个问题。但无论如何,我无法预测每个上传文件的行数。。。我想知道它是否会在某个时候杀死我的服务器,因为我每行进行3db的查询…一定要使用任务队列。我不认为它会杀死你的服务器,除非你得到大量的csv文件。如果是这样,可能是时候启动另一台服务器了。另一个想法是处理csv文件。获取sku的列表。使用
.filter(sku\uu in=list)
检查它们是否在数据库中。获取它们的差异,然后批量创建不在其中的。从那里更新所有现有的。你可能想签出,因为我看到django批量更新使用一些sql脚本。我认为这对我的案子不起作用。因为有些对象可能已经在数据库中,但有些对象肯定不是。。。因此,更新sql将无法工作