python mysql django bulkinsert bulk

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)