python - django bulto crear ignorar duplicados
mysql bulkinsert (2)
El parámetro ignore_conflicts se agregó a bulk_create ( Django 2.2 )
y también puede encontrarlo en https://github.com/django/django/search?q=ignore_conflicts&unscoped_q=ignore_conflicts
Esta pregunta ya tiene una respuesta aquí:
Estoy intentando realizar una inserción masiva en una base de datos MySQL para un conjunto de datos muy grande y me encantaría usar bulk_create
de django mientras se ignoran los errores duplicados.
Modelo de muestra:
class MyModel(models.Model):
my_id=models.IntegerField(primary_key=True)
start_time = models.DateTimeField()
duration = models.IntegerField()
......
description = models.CharField(max_length=250)
hasta ahora tengo el siguiente código (genérico para todos mis modelos, paso en un Model_instance () y [lista de objetos 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)
¿Hay alguna manera en django de hacer esto para evitar duplicados? imitar la insert ignore
de MySQL insert ignore
sería genial. Si simplemente uso bulk_create
(muy rápido), recibo un error si hay un duplicado de la clave principal y se detiene la inserción.
Esta función lo hará.
Nota: esto funcionará solo si tienes un pk
único y no tienes otra cosa 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)
Cómo usar insert_many(MyModel(), list_of_myModels_defined_but_not_saved)