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

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

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

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

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

常规用法:

  1. #!/usr/bin/env python
  2. #coding:utf-8
  3. import os
  4. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
  5. '''
  6. Django 版本大于等于1.7的时候,需要加上下面两句
  7. import django
  8. django.setup()
  9. 否则会抛出错误 django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.
  10. '''
  11. import django
  12. if django.VERSION >= (1, 7):#自动判断版本
  13. django.setup()
  14. def main():
  15. from blog.models import Blog
  16. f = open('oldblog.txt')
  17. for line in f:
  18. title,content = line.split('****')
  19. Blog.objects.create(title=title,content=content)
  20. f.close()
  21. if __name__ == "__main__":
  22. main()
  23. print('Done!')

使用批量导入:

  1. #!/usr/bin/env python
  2. import os
  3. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
  4. def main():
  5. from blog.models import Blog
  6. f = open('oldblog.txt')
  7. BlogList = []
  8. for line in f:
  9. title,content = line.split('****')
  10. blog = Blog(title=title,content=content)
  11. BlogList.append(blog)
  12. f.close()
  13. Blog.objects.bulk_create(BlogList)
  14. if __name__ == "__main__":
  15. main()
  16. print('Done!')

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

  1. #!/usr/bin/env python
  2. import os
  3. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
  4. def main():
  5. from blog.models import Blog
  6. f = open('oldblog.txt')
  7. BlogList = []
  8. for line in f:
  9. parts = line.split('****')
  10. BlogList.append(Blog(title=parts[0], content=parts[1]))
  11. f.close()
  12. # 以上四行 也可以用 列表解析 写成下面这样
  13. # BlogList = [Blog(title=line.split('****')[0], content=line.split('****')[1]) for line in f]
  14. Blog.objects.bulk_create(BlogList)
  15. if __name__ == "__main__":
  16. main()
  17. print('Done!')

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

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

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

只要把上面的:

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

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

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

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

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

  1. [django]Django model中数据批量导入bulk_create()

    参考: https://www.cnblogs.com/ccorz/p/Django-model-zhong-shu-ju-pi-liang-dao-rubulkcreat.html import o ...

  2. [Django]数据批量导入

    前言:历经一个月的复习,考试终于结束了.这期间上班的时候有研究了Django网页制作过程中,如何将数据批量导入到数据库中. 这个过程真的是惨不忍睹,犯了很多的低级错误,这会在正文中说到的.再者导入数据 ...

  3. 将Excle中的数据批量导入数据库

    namespace 将Excle中的数据批量导入数据库{    class Program    {        static void Main(string[] args)        { S ...

  4. mysql中把一个表的数据批量导入另一个表中

    mysql中把一个表的数据批量导入另一个表中   不管是在网站开发还是在应用程序开发中,我们经常会碰到需要将MySQL或MS SQLServer某个表的数据批量导入到另一个表的情况,甚至有时还需要指定 ...

  5. SQL Server中bcp命令的用法以及数据批量导入导出

    原文:SQL Server中bcp命令的用法以及数据批量导入导出 1.bcp命令参数解析 bcp命令有许多参数,下面给出bcp命令参数的简要解析 用法: bcp {dbtable | query} { ...

  6. 将execl里的数据批量导入数据库

    本文将采用NPOI插件来读取execl文件里的数据,将数据加载到内存中的DataTable中 /// <summary> /// 将Excel转换为DataTable /// </s ...

  7. Django model 中的 class Meta 详解

    Django model 中的 class Meta 详解 通过一个内嵌类 "class Meta" 给你的 model 定义元数据, 类似下面这样: class Foo(mode ...

  8. Java实现Excel数据批量导入数据库

    Java实现Excel数据批量导入数据库 概述: 这个小工具类是工作中的一个小插曲哦,因为提数的时候需要跨数据库导数... 有的是需要从oracle导入mysql ,有的是从mysql导入oracle ...

  9. 数据批量导入HBase

    测试数据: datas 1001 lilei 17 13800001111 1002 lily 16 13800001112 1003 lucy 16 13800001113 1004 meimei ...

随机推荐

  1. 对ChemDraw Prime 16.0你了解多少

    ChemDraw Prime 16.0应用是化学智能绘图程序的行业领导者.除了创建符合出版标准的绘图,化学家们可以使用ChemDraw Prime软件预测性能,搜索数据库等来节省时间,提高数据的准确性 ...

  2. 常用帝国cms标签收录

    帝国网站管理系统V6.6版-数据字典 :  http://www.phome.net/doc/manual/extend/html/dbdoc/index.html 帝国模板网:http://www. ...

  3. oracle 中 cursor 与refcursor及sys_refcursor的区别 (转载)

    http://blog.csdn.net/gyflyx/article/details/6889028 引用一.显式cursor 显式是相对与隐式cursor而言的,就是有一个明确的声明的cursor ...

  4. Oracle中给用户赋予debug权限

    通过可视化工具(如PL/SQL Developer.Oracle SQL Developer)调试Oracle的存储过程时,如果遇到如下错误信息:...ORA-01031: insufficient ...

  5. 查看系统进程:ps

    ps命令用于查看系统进程,常见用法如下: [root@localhost ~]$ ps aux # 查看所有的进程 [root@localhost ~]$ ps aux | grep nginx # ...

  6. 《C++ Primer Plus》第7章 函数——C++的编程模块 学习笔记

    函数是C++的编程模块.要使用函数,必须提供定义和原型,并调用该函数.函数定义是实现函数功能的代码:函数原型描述了函数的接口:传递给函数的值的书目和种类以及函数的返回类型.函数调用使得程序将参数传递给 ...

  7. Android英文文档翻译系列(2)——HandlerThread

      public class   HandlerThread extends Thread   Class  Overview Handy class for starting a new threa ...

  8. 关于Windows下的批处理如何模拟Sleep

    好好的批处理,居然没有正式的Sleep可供调用.有时候,确实感到很无趣. 1. 方法1: ping 1.1.1.1来模拟 好不容易从stackoverflow上找到一个答案(称之为答案,是因为它被人标 ...

  9. Hadoop DBOutputFormat的使用

    最近在研究数据在HDFS和关系型数据库之间的迁移,主要使用了两种方式:一是,按照数据库要求的文件格式生成文件,然后由数据库提供的导入工具进行导入:二是采用JDBC的方式进行导入.MapReduce默认 ...

  10. UVa 130 - Roman Roulette

    模拟约瑟夫环  Roman Roulette  The historian Flavius Josephus relates how, in the Romano-Jewish conflict  o ...