2014-11-13 2 views
0

Необходимо импортировать данные из CSV-файлов в приложение Django. Вот как модель выглядит следующим образом:Django - импорт объемных данных: записи не сохранены

class MDfile(models.Model): 
    file_name = models.CharField(max_length=50, editable=False) 
    line = models.IntegerField() 
    mkt_type = models.CharField(max_length=7, editable=False) 
    # ...... etc. 
    yearly_lo_price1 = models.CharField(max_length=9, editable=False) 

И метод, который получает вызывается в обработчике просто:

def impMDfile(self, fileType, fullpath, filename): 

    try: 
     lines=1 
     obj = MDfile() 
     fromFile = open(fullpath) 
     for eachLine in fromFile: 
      fieldsInLine = eachLine.split(",") 
      print fieldsInLine 

      obj.file_name = filename 
      obj.line = lines 
      obj.mkt_type = fieldsInLine[0].strip() 
      # ...... etc. 
      obj.yearly_lo_price1 = fieldsInLine[12].strip() 

      obj.save() 
      lines+=1 
    except BaseException as e: 
     logging.info('\terror importing %s line %d : %s' % (fullpath, lines, e.__str__())) 
    else: 
     logging.info("\timported %s, %d lines" % (fullpath, lines)) 

Проблема: Всего несколько случайных записи будут вставлены в БД, в то время как выводит все строки на терминал при запуске и правильность подсчета строк. Файлы имеют около 1,5 - 2,5 тыс. Строк. Также проверили таблицу с psql.

Использование Django 1.7.1 в Virtualenv; База данных PostgreSQL; Ubuntu 12.04. Я не слишком хорош с Python; и только начал с Django. Любая помощь/указатели оценили, спасибо!

+0

Забыл упоминание: это приложение зарегистрировано в settings.py и вызывается как 'python manage.py ftpimport' – Rambler

+0

Похоже, что вы импортируете CSV. Возможно, вы захотите проверить библиотеку csv Python. – Josh

ответ

0

Вы создаете obj = MDfile() вне цикла for, а затем сохраняете его много раз внутри цикла. Только первое сохранение фактически создает новую запись базы данных. После этого, каждый раз, когда он сохраняется, запись обновляется.

Перемещение этой строки в цикл for является быстрым решением.

Если выполнение слишком медленно, лучше всего было бы не называть .save() на всех, но для создания списка несохраненных MDfile экземпляров, а затем вызвать MDfile.objects.bulk_create(instances) создать их все в одном большом запросе.