在django中执行批量SQL插入

时间:2012-05-19 05:02:38

标签: mysql django django-models

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

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

这似乎很慢,通过这样的django ORM来创建1M对象并将它们插入到db中。有没有比这更好的方法,还是我应该从django离开这个任务并直接用db做?

5 个答案:

答案 0 :(得分:4)

您也可以尝试使用新的bulk_create

答案 1 :(得分:1)

由于您绕过创建所有模型对象,因此您应该将其放到DB-API中。

答案 2 :(得分:1)

恕我直言,如果它只是一次性插入(1M记录不会花费你几个小时),我看不出速度有很大问题。如果您将来使用django api来访问这些对象,那么您可能应该避免使用SQL级别插入,并通过django的方法执行此操作,如livar所建议(如果使用django 1.4)

答案 3 :(得分:1)

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

答案 4 :(得分:0)

您可能需要查看Django DSE包,这显然是一个有效的批量插入/更新库。