批量存在检查+保存 - Django

时间:2010-12-13 14:11:03

标签: python sql sql-server django django-models

  • 我有 CSV 文件,其中列出了我需要存储在数据库中的项目。

  • 我需要检查哪些项目尚未存储,如果没有存储,我需要将它们保存在数据库中。

  • 2-5百万行。


该模型是Django的用户模型。

我有一个以下格式的CSV文件:

  

Item_ID,姓氏 Policy_number ,性别,标题,Start_date

这是代码:

import csv

reader = csv.reader(open('items.csv', 'rb'))

for index, row in enumerate(reader):
    if User.objects.filter(username=row[2]).count():
        continue
    try:
        user = User(username=row[2],last_name=row[1],password='*')
        user.save()
    except Exception, e:
        print e
    del user
    del row
    del index

您推荐的任何方法?

4 个答案:

答案 0 :(得分:2)

取决于具体情况。如果可以将csv数据转换为模型,则应该执行以下操作:

  • 加载csv数据
  • 每行
    • 检查其型号是否存在
    • 如果不是:
      • 根据数据创建新模型并保存。

修改
我认为批量检查存在将是困难的。 模型的批量保存会更快,但根据模型的复杂程度,我认为每个模型都可以省力。

答案 1 :(得分:1)

您需要加载CSV文件,然后使用get_object_or_create方法检查每一行,检查对象是否存在,如果没有,则会为您创建。如果您向我们展示models.py代码,我们可能会更具体地帮助您。

答案 2 :(得分:1)

如果您的内存可以处理用户名变量,这可能是一个很好的优化。

import csv

reader = csv.reader(open('items.csv', 'rb'))

usernames = User.objects.values('username')

for index, row in enumerate(reader):
    if row[2] in usernames:
        continue
    User.objects.create(username=row[2],last_name=row[1],password='*')

如果确实存在内存问题,您可以查看一下这个(现有的)答案: Question about batch save objects in Django

答案 3 :(得分:1)

试试这个。 count()将非常昂贵。

for index, row in enumerate(reader):
    try:
        User.objects.get(username=row[2])
    except User.DoesNotExist:
        user = User(username=row[2],last_name=row[1],password='*')
        user.save()