【问题标题】:Batch existence check + save - Django批量存在检查+保存 - Django
【发布时间】:2023-04-03 22:56:01
【问题描述】:
  • 我有一个 CSV 文件,其中列出了我需要存储在数据库中的项目。

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

  • 2-5 百万行。


模型是 Django 的 User 模型。

我有一个这种形式的 CSV 文件:

Item_ID、SurnamePolicy_number、Sex、Title、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

你有什么推荐的方法吗?

【问题讨论】:

  • 为什么是del?这是自动处理的。这很少有充分的理由。你的模型定义是什么?具体来说,您在 username 属性上指定了哪些索引选项?

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


【解决方案1】:

视情况而定。如果 csv 数据可以转换为模型,应该这样做:

  • 加载 csv 数据
  • 对于每一行:
    • 检查它的模型是否存在
    • 如果不是:
      • 根据数据创建新模型并保存。

编辑:
我认为批量检查是否存在会很困难。 批量保存模型会更快,但根据模型的复杂性,我认为只对每个模型进行保存会更省钱。

【讨论】:

  • 感谢您的回复 :) 我已经这样做了:600k 行后内存使用量为 1.1Gb,而且速度也很慢 :)
  • @RadiantHex:如果速度很慢,您必须提出不同的问题。您需要提供实际模型和实际代码,并且您需要确保您的查找是简单的“精确”匹配并且您有索引。接受这个答案,搜索“Django 慢查询”,然后——如有必要——打开一个新问题。
  • @S.Lott:谢谢! :) 我已经用我的代码更新了问题!
  • 它真的很慢还是只需要一段时间,因为您只是在处理大量数据?有区别。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    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

    【讨论】:

      【解决方案4】:

      试试这个。 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()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-12
        • 2013-06-20
        • 1970-01-01
        相关资源
        最近更新 更多