django批量创建忽略重复

tr3*_*ous 19 python mysql django bulkinsert bulk

我正在尝试批量插入一个非常大的数据集的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)
Run Code Online (Sandbox Code Playgroud)

到目前为止,我有以下代码(所有模型的通用,我传入Model_instance()和[bulk_create对象列表]):

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)
Run Code Online (Sandbox Code Playgroud)

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

gao*_*idf 9

所述ignore_conflicts参数加入到bulk_createDjango的2.2

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

  • 请注意,这不适用于 PostgreSQL < 9.5 和 Oracle。 (2认同)

Wil*_*ley 6

这个功能就可以了.
注意:仅当您具有唯一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)
Run Code Online (Sandbox Code Playgroud)

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

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