【问题标题】:Django efficient bulk_create with unique constraint具有唯一约束的 Django 高效 bulk_create
【发布时间】:2016-10-08 22:05:24
【问题描述】:

我搜索了这个,似乎没有真正好的解决方案(大多数答案都是多年前的)。对于需要唯一的 bulk_creating 对象有什么新的好解决方案吗?

好的,所以我的列表包含约 1000 个字典和字典 ['keyword'] 的唯一约束。到目前为止,我一直是这样做的:

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

然后我 bulk_create 那些不在数据库中的。我正在使用 django 1.10(因为我需要创建对象的 ID)

我正在使用 celery(多个线程)执行此操作,因此存在冲突(两个线程同时添加到数据库)。 get_or_create 可以更有效吗?我有点担心它会导致数据库崩溃,因为有时我会同时添加 5-10 个列表,这会导致大约 10 000 个查询。

【问题讨论】:

    标签: django


    【解决方案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 应该可以正常工作。在您真正遇到性能问题之前,我不会过早地担心它们。

    【讨论】:

      猜你喜欢
      • 2020-01-27
      • 2019-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多