django批量创建忽略重复项[重复]

Posted

技术标签:

【中文标题】django批量创建忽略重复项[重复]【英文标题】:django bulk create ignore duplicates [duplicate] 【发布时间】:2013-06-23 01:26:49 【问题描述】:

我正在尝试将一个非常大的数据集批量插入到 mysql 数据库中,并且希望在忽略重复错误的同时使用 django 的 bulk_create

示例模型:

class MyModel(models.Model):
    my_id=models.IntegerField(primary_key=True)
    start_time = models.DateTimeField()
    duration = models.IntegerField()
    ......
    description = models.CharField(max_length=250)

到目前为止,我有以下代码(我所有模型的通用代码,我传入了 Model_instance() 和 [list of bulk_create objects]):

def insert_many(model, my_objects):
    # list of ids where pk is unique
    in_db_ids = model.__class__.objects.values_list(model.__class__._meta.pk.name)
    if not in_db_ids:
        # nothing exists, save time and bulk_create
        model.__class__.objects.bulk_create(my_objects)
    else:
        in_db_ids_list = [elem[0] for elem in in_db_ids]

        to_insert=[]
        for elem in my_objects:
            if not elem.pk in in_db_ids_list:
                to_insert.append(elem)
        if to_insert:
            model.__class__.objects.bulk_create(to_insert)

django 有没有办法这样做以避免重复?模仿 MySQL 的 insert ignore 会很棒。如果我只是使用bulk_create(非常快),如果主键重复并且插入停止,我会收到错误消息。

【问题讨论】:

看看 [Django bulk_create with ignore rows that cause IntegrityError?][1] or [MySQL INSERT … ON DUPLICATE KEY UPDATE with django 1.4 for bulk insert][2] [1]: @ 987654321@[2]:***.com/questions/12916880/… 【参考方案1】:

ignore_conflicts 参数已添加到 bulk_create(Django 2.2)

你也可以在https://github.com/django/django/search?q=ignore_conflicts&unscoped_q=ignore_conflicts找到它

【讨论】:

请注意,这不适用于 PostgreSQL 【参考方案2】:

这个函数可以做到。 注意:只有当您拥有唯一的 pk 并且没有其他任何 unique 时,这才有效。

def insert_many(model, my_objects):
    # list of ids where pk is unique
    in_db_ids = model.__class__.objects.values_list(model.__class__._meta.pk.name)
    if not in_db_ids:
        # nothing exists, save time and bulk_create
        model.__class__.objects.bulk_create(my_objects)
    else:
        in_db_ids_list = [elem[0] for elem in in_db_ids]

        to_insert = []
        for elem in my_objects:
            if elem.pk not in in_db_ids_list and elem.pk not in to_insert:
                to_insert.append(elem)
        if to_insert:
            model.__class__.objects.bulk_create(to_insert)

如何使用 insert_many(MyModel(), list_of_myModels_defined_but_not_saved)

【讨论】:

此解决方案不是并发安全的。它计算 Python 代码中未插入的行并插入它们,但如果数据库发生更改并且在 values_list() 调用之后添加了这些行之一,bulk_create() 仍然会引发完整性错误。

以上是关于django批量创建忽略重复项[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python SQLAlchemy 批量插入时忽略重复键

Python SQLAlchemy 批量插入时忽略重复键

php Yii2批量插入助手。支持“忽略”和“重复密钥更新”策略

TypeORM 在批量保存时抛出重复错误,而不是忽略或更新现有值

mybatis批量插入数据 ignore关键字忽略重复数据唯一索引

批量创建带有参数的cmd命令[重复]