首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Django将数千条记录插入到SQLite表中的有效方法是什么?

使用Django将数千条记录插入到SQLite表中的有效方法是什么?
EN

Stack Overflow用户
提问于 2009-07-16 08:08:31
回答 8查看 64.8K关注 0票数 74

我必须使用Django的ORM将8000+记录插入到SQLite数据库中。此操作大约每分钟需要作为cronjob运行一次。

目前,我使用for循环遍历所有项,然后逐个插入它们。

示例:

代码语言:javascript
复制
for item in items:
    entry = Entry(a1=item.a1, a2=item.a2)
    entry.save()

执行此操作的有效方法是什么?

编辑:两种插入方法之间的一点比较。

不使用commit_manually装饰器(11245条记录):

代码语言:javascript
复制
nox@noxdevel marinetraffic]$ time python manage.py insrec             

real    1m50.288s
user    0m6.710s
sys     0m23.445s

使用commit_manually装饰器(11245条记录):

代码语言:javascript
复制
[nox@noxdevel marinetraffic]$ time python manage.py insrec                

real    0m18.464s
user    0m5.433s
sys     0m10.163s

注意:除了插入到数据库中之外,测试脚本还执行其他一些操作(下载ZIP文件,从ZIP存档中提取XML文件,解析XML文件),因此执行所需的时间并不一定代表插入记录所需的时间。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 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

所以它应该是这样的:

代码语言:javascript
复制
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中引入了上下文管理器。因此,现在您可以以类似的方式使用:

代码语言:javascript
复制
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,允许您创建模型对象的列表,然后一次性提交所有对象。

注意:当使用批量创建时,将不会调用方法。

代码语言:javascript
复制
>>> 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_successcommit_manually

来自django documentation on atomic

原子既可用作装饰器,也可用作装饰器:

代码语言:javascript
复制
from django.db import transaction

@transaction.atomic
def viewfunc(request):
    # This code executes inside a transaction.
    do_stuff()

并且作为上下文管理器:

代码语言:javascript
复制
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()
票数 128
EN

Stack Overflow用户

发布于 2011-11-02 02:45:49

票数 11
EN

Stack Overflow用户

发布于 2009-07-16 08:18:01

看看this吧。它仅用于开箱即用的MySQL,但也有关于如何对其他数据库执行操作的指针。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1136106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档