Django - 批量数据导入:未保存的记录

时间:2014-11-13 14:15:14

标签: python django

需要将CSV文件中的数据导入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.5k行。也用psql检查了表。

在Virtualenv中使用Django 1.7.1; PostgreSQL数据库; Ubuntu 12.04。我对Python不太好;刚刚开始使用Django。任何帮助/指示赞赏,谢谢!

1 个答案:

答案 0 :(得分:0)

您在for循环之外创建obj = MDfile(),然后在循环内多次保存。 只有第一个保存实际上会创建一个新的数据库记录。之后,每次保存时,记录都会更新。

将该行移动到for循环中是一个快速解决方法。

如果执行速度太慢,更好的方法是根本不调用.save(),而是构建未保存的MDfile实例列表,然后调用MDfile.objects.bulk_create(instances)创建它们所有这一切都在一个大问题中。