2013-06-26 37 views
15

Tôi đang cố gắng chèn số lượng lớn vào một db MySQL cho một tập dữ liệu rất lớn và rất thích sử dụng django's bulk_create trong khi bỏ qua các lỗi trùng lặp.django số lượng lớn tạo ra bỏ qua trùng lặp

mô hình mẫu:

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

cho đến nay tôi đã đoạn mã sau (chung cho tất cả các mô hình của tôi, tôi vượt qua trong một Model_instance() và [danh sách các đối tượng 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) 

Có cách nào trong django làm điều này để tránh trùng lặp? bắt chướccủa MySQL sẽ rất tuyệt. Nếu tôi chỉ đơn giản sử dụng bulk_create (rất nhanh), tôi gặp lỗi nếu có một khóa chính trùng lặp và chèn dừng lại.

+2

Hãy nhìn vào [Django bulk_create với bỏ qua hàng gây IntegrityError?] [1] hoặc [MySQL INSERT ... ON DUPLICATE CẬP NHẬT KEY với django 1,4 cho số lượng lớn chèn] [2] [1]: http://stackoverflow.com/questions/12451053/django-bulk-create-with-ignore-rows-that-cause-integrityerror [2]: http: // stackoverflow.co m/câu hỏi/12916880/mysql-insert-on-duplicate-key-cập nhật-với-django-1-4-cho-số lượng lớn-chèn –

Trả lời

4

Điều này là không thể? Tôi không chắc chắn nếu tôi sử dụng danh sách cắt lát một cách chính xác nhưng nó đã được sự hiểu biết của tôi rằng nó cho phép bạn tham khảo một danh sách đang được thao tác trong một vòng lặp.

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 and not elem.pk in to_insert[:]: 
       to_insert[:].append(elem) 
     if to_insert: 
      model.__class__.objects.bulk_create(to_insert) 
Các vấn đề liên quan