Django有效的bulk_create具有唯一约束

时间:2016-06-08 14:48:10

标签: django

我搜索了这个并且似乎没有真正好的解决方案(大多数答案都是岁月)。对于需要唯一的bulk_creating对象,是否有任何新的良好解决方案?

好的,所以我在dict ['keyword']上有包含~1000个词组和唯一约束的列表。到目前为止,我一直在这样做:

self.get_existing_KeyO = \
list(KeyO.objects.filter(keyword__in=[x['keyword'] for x in self.data]).all())

然后我批量创建那些尚未存在于数据库中的文件。我正在使用django 1.10(因为我需要创建对象的ID)

我使用celery(多线程)执行此操作,因此存在冲突(两个线程同时添加到数据库)。 get_or_create可以提高效率吗?我有点害怕它会崩溃DB,因为有时我会同时添加5-10个列表,这将导致~10 000个查询。

1 个答案:

答案 0 :(得分:1)

最佳方法取决于碰撞的可能性。如果它们很少见,那么使用bulk_create的乐观并发方法应该可以正常工作。类似的东西:

while True:
    existing = set(KeyO.objects.filter(keyword__in=[x['keyword'] for x in self.data])
                               .values_list("keyword", flat=True))

    try:
        KeyO.objects.bulk_create(KeyO(...) for x in self.data 
                                 if x['keyword'] not in existing)
    except IntegrityError:
         continue
    else:
         break

如果碰撞很常见,那么在循环中使用get_or_create应该可以正常工作。在您真正遇到性能问题之前,我不会过早担心性能问题。