这个问题已经在这里有一个答案:
我想批量插入到一个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()和[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)
是否有以避免重复这样的Django的一种方式?模仿MySQL的insert ignore
将是巨大的。如果我只是使用bulk_create
(非常快),我得到一个错误,如果有一个主键重复和插入停止。
此功能会做到这一点。
注意:如果你有独特的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)
所述ignore_conflicts参数加入到bulk_create(Django 2.2)
你也可以找到它在https://github.com/django/django/search?q=ignore_conflicts&unscoped_q=ignore_conflicts