【问题标题】:Doing a bulk SQL insert in django在 django 中进行批量 SQL 插入
【发布时间】:2012-05-19 05:02:37
【问题描述】:

假设我有一个包含 100 万个电子邮件地址的 CSV 文件。我需要遍历文件并添加每个条目,例如:

with open(file) as csv:
    for item in csv:
        Email.objects.create(email=item)

这看起来像这样通过 django ORM 创建 1M 对象并将它们插入数据库会很慢。有没有比这更好的方法,还是我应该离开 django 来完成这项任务并直接使用 db 来完成?

【问题讨论】:

  • 你不应该使用csv作为一个变量,因为它是一个内置模块的名字。

标签: mysql django django-models


【解决方案1】:

您也可以尝试使用新的bulk_create

【讨论】:

    【解决方案2】:

    除了bulk_create,只要您的数据库后端支持,您可以将所有插入放入一个事务中:

    from django.db.transaction import commit_on_success
    #  with commit_on_success(), open(file) as csv: # in Python2.7
    with commit_on_success():
        for item in csv:
            Email.objects.create(email=item)
    

    还要注意bulk_create 将具有相同值的项目视为相同,因此

    Email.objects.bulk_create([Email(email=item), Email(email=item)]) 
    

    实际上是创建一行而不是两行

    由于更多的 SQL 周转,事务解决方案仍然比bulk_create 慢,但您不必在内存中创建所有一百万个Email() 实例(生成器似乎在这里不起作用)

    另外,你可以do it in SQL-level directly

    【讨论】:

      【解决方案3】:

      这是您应该使用 DB-API 来完成的事情,因为您绕过了创建所有模型对象。

      【讨论】:

        【解决方案4】:

        恕我直言,如果它只是一次性插入,我认为速度不会有很大问题(1M 记录不会花费你几个小时)。如果您将来要使用 django api 来访问这些对象,那么您可能应该避免使用 SQL 级别的插入,而是通过 django 的方法来完成,就像 livar 建议的那样(如果使用 django 1.4)

        【讨论】:

          【解决方案5】:

          您可能想查看Django DSE 包,它显然是一个高效的批量插入/更新库。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-02-24
            • 1970-01-01
            • 1970-01-01
            • 2011-07-28
            • 2014-10-06
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多