Загрузите 10000 записей xlxs в mysql с помощью django

#python #mysql #django #excel #django-queryset

Вопрос:

У меня есть около 10 тысяч файлов xlxs (каждый с 4 разными листами и одинаковым форматом данных для всех листов). Я хотел получить эти данные и добавить их в таблицы MySQL. С моим текущим кодом это занимает около 1-2 часов. для извлечения и заполнения данных. Я хотел оптимизировать это и сократить время примерно до 5-10 минут для 10 тыс. файлов. Пожалуйста, предложите мне правильное решение. ТИА.

 class ImportFileView(APIView):  def post(self,request):   xlsx_file = request.FILES.getlist('file') # Around 10k files   for file in xlsx_file:   wb_obj = openpyxl.load_workbook(file)   working_sheet = wb_obj['Sheet1']    create_table_one = TableOne.objects.create(  id = working_sheet['B1'].value,  first_name = working_sheet['B2'].value,  last_name = working_sheet['B3'].value,  country = working_sheet['B4'].value,  region = working_sheet['B5'].value,  lab = working_sheet['B6'].value,  sample_date = working_sheet['B7'].value,  issue_date = working_sheet['B8'].value,  release_year = working_sheet['B9'].value,  comments = working_sheet['B10'].value,  )   create_table_one.save()     for col in range(2,4):  group = working_sheet[get_column_letter(col) str(11)].value  name = working_sheet[get_column_letter(col) str(12)].value  unit = working_sheet[get_column_letter(col) str(13)].value  sample_unit = working_sheet[get_column_letter(col) str(14)].value  parameter = working_sheet[get_column_letter(col) str(15)].value  type = working_sheet[get_column_letter(col) str(16)].value  default_value = working_sheet[get_column_letter(col) str(17)].value   for row in range(19,90):  create_data = TableData.objects.create(  id = create_table_one.id,  temperature = working_sheet['A' str(row)].value,  group = group,  name = name,  unit = unit,  sample_unit = sample_unit,  parameter = parameter,  type = type,  default_value = default_value,  actual_value = working_sheet[get_column_letter(col) str(row)].value  )   create_data.save()   working_sheet = wb_obj['Sheet2']    for col in range(2,100):  if working_sheet[get_column_letter(col) str(5)].value == None or working_sheet[get_column_letter(col) str(5)].value == "":  break    group = working_sheet[get_column_letter(col) str(5)].value  name = working_sheet[get_column_letter(col) str(6)].value  unit = working_sheet[get_column_letter(col) str(7)].value  sample_unit = working_sheet[get_column_letter(col) str(8)].value  parameter = working_sheet[get_column_letter(col) str(9)].value  type = working_sheet[get_column_letter(col) str(10)].value  default_value = working_sheet[get_column_letter(col) str(11)].value   for row in range(13,83):  actual_value = working_sheet[get_column_letter(col) str(row)].value    create_property_table = TableProperties.objects.create(  id = create_assay.id,  temperature = working_sheet['A' str(row)].value,  group = property_group,  name = property_name,  unit = unit,  sample_unit= sample_unit,  parameter = parameter,  type = type,  default_value = default_value,  actual_value = actual_value  )   create_property_table.save()    working_sheet = wb_obj['Sheet3']   for row in range(3,83):  create_crude_data = TableCrudeData.objects.create(  id = create_table_one.id,  component = working_sheet['A' str(row)].value,  pcnt = working_sheet['B' str(row)].value  )   create_crude_data.save()     working_sheet = wb_obj['Sheet4']   for row in range(2,67):  create_properties = TablePropertiesTwo.objects.create(  id = create_table_one.id,  group = working_sheet[get_column_letter(1) str(row)].value,  name = working_sheet[get_column_letter(2) str(row)].value,  unit = working_sheet[get_column_letter(3) str(row)].value,  sample_unit = working_sheet[get_column_letter(4) str(row)].value,  parameter = working_sheet[get_column_letter(5) str(row)].value,  type = working_sheet[get_column_letter(6) str(row)].value,  default_value = working_sheet[get_column_letter(7) str(row)].value,  actual_value = working_sheet[get_column_letter(8) str(row)].value  )   create_properties.save()    return Response({  'success' : True  })   

Комментарии:

1. Так что просто для уверенности: вы отправляете один 1-2-часовой почтовый вызов в Django, где он почему-то не совпадает по времени и загружает/обрабатывает 10 тыс. документов? Что произойдет, если предпоследний сломается? Это звучит как плохой дизайн, и я бы искал асинхронные способы сделать это. Потенциально разделение нагрузки и параллельное выполнение задач (при условии, что серверная часть может справиться с этим).

2. Разве вам не нужно небольшое количество столов вместо 10 тысяч столов?

3. Являются INSERTs ли «упакованные» каким-то образом? (Я не вижу этих деталей в коде.)