假设我有一个包含1M个电子邮件地址的CSV文件。我需要通过文件迭代,并添加每个条目,例如:在django中执行批量SQL插入
with open(file) as csv:
for item in csv:
Email.objects.create(email=item)
这似乎将是非常慢的经历Django的ORM这样创造1M对象并将其插入到数据库。有没有比这更好的方法,还是应该离开django完成这个任务,并直接使用db?
假设我有一个包含1M个电子邮件地址的CSV文件。我需要通过文件迭代,并添加每个条目,例如:在django中执行批量SQL插入
with open(file) as csv:
for item in csv:
Email.objects.create(email=item)
这似乎将是非常慢的经历Django的ORM这样创造1M对象并将其插入到数据库。有没有比这更好的方法,还是应该离开django完成这个任务,并直接使用db?
除了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
对待项w /相同的价值观是相同的,因此
Email.objects.bulk_create([Email(email=item), Email(email=item)])
实际上CR eates一排,而不是两个
因为越来越SQLS好转,交易解决方案仍然比bulk_create
一个慢一些,但您不必在内存中创建100万个Email()
实例(发电机似乎不在这里工作)
因为您绕过了创建所有模型对象,所以您应该放到DB-API中完成。
您也可以尝试使用新bulk_create
恕我直言,我看不出有很大的问题,如果速度这只是一次性的刀片(1M记录将不带你小时)。如果将来使用django api访问这些对象,那么可能应该避免使用SQL级别插入,并通过django的方法执行操作,如livar所示(如果使用django 1.4)
你可能要考虑的Django DSE包,这显然是一个有效的批量插入/更新库。
您不应该使用'csv'作为变量,因为它是内置模块的名称。 –