python Django批量导入数据


Posted in Python onMarch 25, 2016

前言:

这期间有研究了Django网页制作过程中,如何将数据批量导入到数据库中.

这个过程真的是惨不忍睹,犯了很多的低级错误,这会在正文中说到的.再者导入数据用的是py脚本,脚本内容参考至自强学堂--中级教程--数据导入.

 注:本文主要介绍自己学习的经验总结,而非教程!

正文:首先说明采用Django中bulk_create()函数来实现数据批量导入功能,为什么会选择它呢?

1 bulk_create()是执行一条SQL存入多条数据,使得导入速度更快;

2 bulk_create()减少了SQL语句的数量;

       然后,我们准备需要导入的数据源,数据源格式可以是xls,csv,txt等文本文档;

       最后,编写py脚本,运行即可!

py脚本如下:

#coding:utf-8 

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

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


if django.VERSION >= (1, 7):#自动判断版本
  django.setup()

from keywork.models import LOrder

f = open('cs.csv')
WorkList = []
next(f) #将文件标记移到下一行
for line in f:
  parts = line.replace('"','') #将字典中的"替换空
  parts = parts.split(';') #按;对字符串进行切片
  WorkList.append(LOrder(serv_id=parts[0], serv_state_name=parts[1], acct_code=parts[2], acct_name=parts[3], acc_nbr=parts[4], user_name=parts[5],
              frod_addr=parts[6], mkt_chnl_name=parts[7],mkt_grid_name=parts[8], com_chnl_name=parts[9],com_grid_name=parts[10],
              product_name=parts[11],access_name=parts[12], completed_time=parts[13],remove_data=parts[14], service_offer_name=parts[15],
              org_name=parts[16], staff_name=parts[17],staff_code=parts[18], handle_time=parts[19],finish_time=parts[20],
              prod_offer_name=parts[21],eff_date=parts[22], exp_date=parts[23],main_flag=parts[24], party_name=parts[25]
              )
          )
f.close() 
LOrder.objects.bulk_create(WorkList)

根据上面py脚本源代码主要来说说自己学习过程中遇见的问题

问题1:需要导入的数据源中其第一行一般是字段名,从第二行开始才是数据,所以在脚本利用next(f)将文本标记移到第二行进行操作,不然会出现问题,比如字段名一般为英文,默认是字符串格式化,脚本执行就会遇见ValidationError:YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]这种models数据格式与导入数据格式不相符合的错误!

问题2:注意parts = parts.split(';') #按;对字符串进行切片该语句,因为我们导入数据每一行中的每列数据之间有间隔符,例如csv中逗号,xls中空格等各种文本默认间隔符号,split函数使用实例如下:

以下实例展示了split()函数的使用方法: 

#!/usr/bin/python

str = "Line1-abcdef \nLine2-abc \nLine4-abcd";
print str.split( );
print str.split(' ', 1 );

以上实例输出结果如下: 

['Line1-abcdef', 'Line2-abc', 'Line4-abcd']
['Line1-abcdef', '\nLine2-abc \nLine4-abcd']
问题3:如果导入数据源超过10M,然后数据库默认最大10M,那么上面脚本运行不会成功.以mysql为例,若导入数据大小超过数据设置,那么会报2006 go away错误,需要在mysql中的my.ini中的[mysqld]下加入下列语句:

max_allowed_packet=300M --最大允许包大小300M
wait_timeout=200000  --连接时间200000s
interactive_timeout = 200000 --断开时间200000s

以上就是本文的全部内容,希望对大家学习python批量导入数据有所帮助。

Python 相关文章推荐
浅析python 内置字符串处理函数的使用方法
Jun 11 Python
Python+django实现文件下载
Jan 17 Python
Django视图之ORM数据库查询操作API的实例
Oct 27 Python
Python类的继承和多态代码详解
Dec 27 Python
python 巧用正则寻找字符串中的特定字符的位置方法
May 02 Python
django认证系统实现自定义权限管理的方法
Jul 16 Python
Python制作微信好友背景墙教程(附完整代码)
Jul 17 Python
如何使用python操作vmware
Jul 27 Python
Python 二叉树的层序建立与三种遍历实现详解
Jul 29 Python
Python爬取豆瓣视频信息代码实例
Nov 16 Python
python实现mean-shift聚类算法
Jun 10 Python
解决python3输入的坑——input()
Dec 05 Python
python Django批量导入不重复数据
Mar 25 #Python
用Python实现斐波那契(Fibonacci)函数
Mar 25 #Python
Python基础教程之正则表达式基本语法以及re模块
Mar 25 #Python
详解Python使用simplejson模块解析JSON的方法
Mar 24 #Python
解决Python出现_warn_unsafe_extraction问题的方法
Mar 24 #Python
python 回调函数和回调方法的实现分析
Mar 23 #Python
python 时间戳与格式化时间的转化实现代码
Mar 23 #Python
You might like
PHP-Fcgi下PHP的执行时间设置方法
2013/08/02 PHP
CodeIgniter中实现泛域名解析
2014/07/19 PHP
JavaScript 学习历程和心得分享
2010/12/12 Javascript
js当一个变量为函数时 应该注意的一点细节小结
2011/12/29 Javascript
两个select多选模式的选项相互移动(示例代码)
2014/01/11 Javascript
通过JS动态创建一个html DOM元素并显示
2014/10/15 Javascript
jquery滚动到顶部底部代码
2015/04/20 Javascript
jQuery+AJAX实现遮罩层登录验证界面(附源码)
2020/09/13 Javascript
JavaScript类型检测之typeof 和 instanceof 的缺陷与优化
2016/01/13 Javascript
js浏览器html5表单验证
2016/10/17 Javascript
使用gulp搭建本地服务器并实现模拟ajax
2017/04/05 Javascript
Angular.js中控制器之间的传值详解
2017/04/24 Javascript
js实现可以点击收缩或张开的悬浮窗
2017/09/18 Javascript
node.js用fs.rename强制重命名或移动文件夹的方法
2017/12/27 Javascript
vue 组件 全局注册和局部注册的实现
2018/02/28 Javascript
让Vue也可以使用Redux的方法
2018/05/23 Javascript
Bootstrap Table列宽拖动的方法
2018/08/15 Javascript
JavaScript数值类型知识汇总
2019/11/17 Javascript
webpack中的模式(mode)使用详解
2020/02/20 Javascript
[01:12:44]VG vs Mineski Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
[45:59]完美世界DOTA2联赛PWL S2 FTD vs GXR 第二场 11.22
2020/11/24 DOTA
python使用PyFetion来发送短信的例子
2014/04/22 Python
python简单读取大文件的方法
2016/07/01 Python
Python实现一个简单的验证码程序
2017/11/03 Python
pandas 将list切分后存入DataFrame中的实例
2018/07/03 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
2019/12/19 Python
Python爬虫之App爬虫视频下载的实现
2020/12/08 Python
墨尔本照明批发商店:Mica Lighting
2017/12/28 全球购物
日本酒店、民宿、温泉旅馆、当地旅行团中文预订:e路东瀛
2019/12/09 全球购物
应届生.NET方向面试题
2015/05/23 面试题
给水排水工程专业毕业生推荐信
2013/10/28 职场文书
索赔员岗位职责
2015/02/15 职场文书
欠款纠纷起诉状
2015/05/19 职场文书
签约仪式致辞
2015/07/30 职场文书
解决SpringBoot跨域的三种方式
2021/06/26 Java/Android
Java 多态分析
2022/04/26 Java/Android