Django model中数据批量导入bulk_create()

在Django中需要向数据库中插入多条数据(list)。使用如下方法,每次save()的时候都会访问一次数据库。导致性能问题:

for i in resultlist:
    p = Account(name=i)
    p.save()

在django1.4以后加入了新的特性。使用django.db.models.query.QuerySet.bulk_create()批量创建对象,减少SQL查询次数。改进如下:

querysetlist=[]
for i in resultlist:
    querysetlist.append(Account(name=i))
Account.objects.bulk_create(querysetlist)

Model.objects.bulk_create() 更快更方便

常规用法:

#!/usr/bin/env python
#coding:utf-8

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")

‘‘‘
Django 版本大于等于1.7的时候,需要加上下面两句
import django
django.setup()
否则会抛出错误 django.core.exceptions.AppRegistryNotReady: Models aren‘t loaded yet.
‘‘‘

import django
if django.VERSION >= (1, 7):#自动判断版本
    django.setup()
def main():
    from blog.models import Blog
    f = open(‘oldblog.txt‘)
    for line in f:
        title,content = line.split(‘****‘)
        Blog.objects.create(title=title,content=content)
    f.close()

if __name__ == "__main__":
    main()
    print(‘Done!‘)

使用批量导入:

#!/usr/bin/env python
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")

def main():
    from blog.models import Blog
    f = open(‘oldblog.txt‘)
    BlogList = []
    for line in f:
        title,content = line.split(‘****‘)
        blog = Blog(title=title,content=content)
        BlogList.append(blog)
    f.close()

    Blog.objects.bulk_create(BlogList)

if __name__ == "__main__":
    main()
    print(‘Done!‘)

由于Blog.objects.create()每保存一条就执行一次SQL,而bulk_create()是执行一条SQL存入多条数据,会快很多!当然用列表解析代替 for 循环会更快!!

#!/usr/bin/env python
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")

def main():
    from blog.models import Blog
    f = open(‘oldblog.txt‘)

    BlogList = []
    for line in f:
        parts = line.split(‘****‘)
        BlogList.append(Blog(title=parts[0], content=parts[1]))

    f.close()

    # 以上四行 也可以用 列表解析 写成下面这样
    # BlogList = [Blog(title=line.split(‘****‘)[0], content=line.split(‘****‘)[1]) for line in f]

    Blog.objects.bulk_create(BlogList)
if __name__ == "__main__":
    main()
    print(‘Done!‘)

批量导入时数据重复的解决方法

如果你导入数据过多,导入时出错了,或者你手动停止了,导入了一部分,还有一部分没有导入。或者你再次运行上面的命令,你会发现数据重复了,怎么办呢?

django.db.models 中还有一个函数叫 get_or_create(),之前文章中也提到过,有就获取过来,没有就创建,用它可以避免重复,但是速度可以会慢些,因为要先尝试获取,看看有没有

只要把上面的:

Blog.objects.create(title=title,content=content)

换成下面的就不会重复导入数据了

Blog.objects.get_or_create(title=title,content=content)

返回值是(BlogObject, True/False)新建时返回 True, 已经存在时返回 False。

原文地址:https://www.cnblogs.com/lianhaifeng/p/11909226.html

时间: 2024-08-24 20:27:28

Django model中数据批量导入bulk_create()的相关文章

c#如何将dataset中的数据批量导入oracle数据库

不要写insert语句,因为数据库字段太多了,有什么简单点的效率高的方法吗 public void MultiInsertData(DataSet ds) { string connt = "Oracle的连接字符串"; string sql = "select id,name,- from tablename";必须与ds中的一致 DataTable dt = ds.Defaults[0]; OracleConnection conn = new OracleCo

mysql中把一个表的数据批量导入另一个表中(不同情况)

mysql中把一个表的数据批量导入另一个表中 不管是在网站开发还是在应用程序开发中,我们经常会碰到需要将MySQL某个表的数据批量导入到另一个表的情况,甚至有时还需要指定导入字段. 本文就将以MySQL数据库为例,介绍如何通过SQL命令行将某个表的所有数据或指定字段的数据,导入到目标表 中. 类别一. 如果两张张表(导出表和目标表)的字段一致,并且希望插入全部数据,可以用这种方法:(此方法只适合导出两表在同一database) INSERT INTO 目标表 SELECT * FROM 来源表;

将ACCESS数据批量导入SQL SERVER

代码: IF OBJECT_ID('Sp_InputAccesstoSQL') IS NOT NULL     DROP PROC Sp_InputAccesstoSQL GO CREATE PROC Sp_InputAccesstoSQL @dir NVARCHAR(100),--ACCESS文件存放路径:如D:\Files @tabname NVARCHAR(50) --定义导入到数据库中的表名,如果存在就不需要创建 AS SET NOCOUNT ON DECLARE @cmd NVARCH

数据批量导入HBase

测试数据: datas 1001 lilei 17 13800001111 1002 lily 16 13800001112 1003 lucy 16 13800001113 1004 meimei 16 13800001114 数据批量导入使用mr,先生成HFile文件然后在用completebulkload工具导入. 1.需要先在hbase 创建表名: hbase> create 'student', {NAME => 'info'} maven pom.xml配置文件如下: <de

用java实现excel数据批量导入数据库

不管是做软件还是做网站,相信很多人在做的时候都要用到数据库,而数据库的数据从何而来呢,可以使手动添加的,但是大多数情况下我们使用的是已有的数据,我们想借助开发的工具管理目前已有的数据,如果是小量的数据,手动录入也无妨,但是对于大量数据呢,手动录入显然已经不显示,而且,更多的时候,我们呢想在软件上增加一个数据的批量导入,这样不管是谁在用这款软件,都可以方便的管理已有数据,那么我们最常用的数据管理器是什么呢,毫无疑问Excel,但是我们做软件是几乎没有人会使用Excel作为DB,所以我们遇到的问题就

UUIDField在Django Model中的使用经验

今天下午在将数据库从旧库导入到新库时,完成后发现Django网站无法打开,报"ValueError, badly formed hexadecimal UUID string",最终定位到原因是一个UUIDField类型字段的值为0,造成Django无法将0验证为UUID类型,从而引发ValueError异常.现总结UUIDField在Django Model中的使用经验如下. 在Django中UUIDField类型的字段可以作为主键(主键是绝对不可能为NULL值的)使用,这个是丝毫没

java把excel数据批量导入到数据库

java把excel数据批量导入到数据库中,java导入excel数据代码如下 1.    public List<Choice> GetFromXls(String xlsname){ 2. 3.        List<Choice> choices = new ArrayList<Choice>(); 4.        Choice choice=null; 5.        try { 6.            java.io.File file=new

将Excel中的数据批量导入数据库表

private boolean import_to_database(String excel_path) throws BiffException, IOException, HsException{ File file = new File(excel_path);//根据文件名创建一个文件对象 Workbook wb = Workbook.getWorkbook(file);//从文件流中取得Excel工作区对象 Sheet sheet = wb.getSheet(0);//从工作区中取得

Shp数据批量导入Postgresql工具的原理和设计

1.背景 在制作整体的开源工具箱产品中,数据入库是一个重要的环节.虽然PostGIS提供了数据入库界面化操作,但是毕竟此工具无法集成至我方工具箱中,并且该工具界面.操作都不是很理想,也无法定制化完成一些具体需求.所以,自制一个shp入库工具还是比较有必要的. 2.思路 2.1  shp导入思路 Shp导入至数据库中,无论是Postgresql.mysql.oracle等,均是先将Shp转换成符合对应数据库的sql,然后再导入进去对应数据库. 针对Postgresql,在PG的安装路径下有pgsq