我必须使用Django的ORM将8000+记录插入到SQLite数据库中。此操作大约每分钟需要作为cronjob运行一次。
目前,我使用for循环遍历所有项,然后逐个插入它们。
示例:
for item in items:
entry = Entry(a1=item.a1, a2=item.a2)
entry.save()
执行此操作的有效方法是什么?
编辑:两种插入方法之间的一点比较。
不使用commit_manually装饰器(11245条记录):
nox@noxdevel marinetraffic]$ time python manage.py insrec
real 1m50.288s
user 0m6.710s
sys 0m23.445s
使用commit_manually装饰器(11245条记录):
[nox@noxdevel marinetraffic]$ time python manage.py insrec
real 0m18.464s
user 0m5.433s
sys 0m10.163s
注意:除了插入到数据库中之外,测试脚本还执行其他一些操作(下载ZIP文件,从ZIP存档中提取XML文件,解析XML文件),因此执行所需的时间并不一定代表插入记录所需的时间。
发布于 2009-07-16 08:44:57
你想看看django.db.transaction.commit_manually
。
http://docs.djangoproject.com/en/dev/topics/db/transactions/#django-db-transaction-commit-manually
所以它应该是这样的:
from django.db import transaction
@transaction.commit_manually
def viewfunc(request):
...
for item in items:
entry = Entry(a1=item.a1, a2=item.a2)
entry.save()
transaction.commit()
它将只提交一次,而不是在每次save()时提交。
在django 1.3中引入了上下文管理器。因此,现在您可以以类似的方式使用:
from django.db import transaction
def viewfunc(request):
...
with transaction.commit_on_success():
for item in items:
entry = Entry(a1=item.a1, a2=item.a2)
entry.save()
在Django1.4中,添加了bulk_create
,允许您创建模型对象的列表,然后一次性提交所有对象。
注意:当使用批量创建时,将不会调用方法。
>>> Entry.objects.bulk_create([
... Entry(headline="Django 1.0 Released"),
... Entry(headline="Django 1.1 Announced"),
... Entry(headline="Breaking: Django is awesome")
... ])
在Django1.6中,引入了,旨在取代现在遗留的函数commit_on_success
和commit_manually
。
来自django documentation on atomic
原子既可用作装饰器,也可用作装饰器:
from django.db import transaction
@transaction.atomic
def viewfunc(request):
# This code executes inside a transaction.
do_stuff()
并且作为上下文管理器:
from django.db import transaction
def viewfunc(request):
# This code executes in autocommit mode (Django's default).
do_stuff()
with transaction.atomic():
# This code executes inside a transaction.
do_more_stuff()
发布于 2011-11-02 02:45:49
批量创建在Django 1.4中可用:
https://django.readthedocs.io/en/1.4/ref/models/querysets.html#bulk-create
发布于 2009-07-16 08:18:01
看看this吧。它仅用于开箱即用的MySQL,但也有关于如何对其他数据库执行操作的指针。
https://stackoverflow.com/questions/1136106
复制相似问题