Django MySQL - 在DB中一起保存多个记录

时间:2016-03-20 05:31:08

标签: python mysql django python-2.7

我正在尝试在Django MySQL中保存多条记录。 我可以单独保存每条记录,但随着阵列大小的增加,它会变得太慢。

代码:[更新]

def MultipleSave(array1, array2, key1, key2):
    insert_list = []
    l = len(array1)
    for i in range(0, l):
        try:
            str1 = array1[i]
            str2 = array2[i]

            try:
                new_record = UserString.objects.filter(original=str1)
                new_record = new_record[0]

                setattr(new_record, key2, str2)
                new_record.save()
            except Exception as e:            
                new_record = UserString(original=str1)

                setattr(new_record, key1, str1)
                setattr(new_record, key2, str2)
                insert_list.append(new_record)

        except Exception as e:
            print ('Exception occured: "%s"' % e)

    if len(insert_list) > 0:
        UserString.objects.bulk_create(insert_list)

[更新]:此更新的代码现在使用bulk_create一次创建所有新记录。但现有记录仍然一次更新一次。

是否有另一种方法可以在数据库中同时保存/更新所有记录而不是每条记录?或者,如何优化此代码?

欢迎任何建议。

谢谢,

1 个答案:

答案 0 :(得分:0)

通过创建一个新列表update_list解决了这个问题,该列表包含需要更新的所有记录,然后使用transaction.atomic()

一次性保存所有记录

更新代码[工作] :(在Django 1.9中)

def MultipleSave(array1, array2, key1, key2):
    insert_list = []
    update_list = []
    l = len(array1)
    for i in range(0, l):
        try:
            str1 = array1[i]
            str2 = array2[i]

            try:
                new_record = UserString.objects.filter(original=str1)
                new_record = new_record[0]

                setattr(new_record, key2, str2)
                update_list.append(new_record)
            except Exception as e:            
                new_record = UserString(original=str1)

                setattr(new_record, key1, str1)
                setattr(new_record, key2, str2)
                insert_list.append(new_record)

        except Exception as e:
            print ('Exception occured: "%s"' % e)

    if len(insert_list) > 0:
        UserString.objects.bulk_create(insert_list)

    with transaction.atomic():
        for record in update_list:
            record.save()

希望这可能会有所帮助。 谢谢,