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 Web框架Flask下网站开发入门实例
Feb 08 Python
用Python编写简单的定时器的方法
May 02 Python
Python数据类型详解(二)列表
May 08 Python
完美解决python遍历删除字典里值为空的元素报错问题
Sep 11 Python
详谈在flask中使用jsonify和json.dumps的区别
Mar 26 Python
python使用pymongo操作mongo的完整步骤
Apr 13 Python
django获取from表单multiple-select的value和id的方法
Jul 19 Python
softmax及python实现过程解析
Sep 30 Python
Python笔记之观察者模式
Nov 20 Python
在tensorflow中实现屏蔽输出的log信息
Feb 04 Python
Python3操作MongoDB增册改查等方法详解
Feb 10 Python
基于Python数据分析之pandas统计分析
Mar 03 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 fsockopen函数被禁用的解决办法
2013/08/07 PHP
PHP中基本HTTP认证技巧分析
2015/03/16 PHP
PHP中加速、缓存扩展的区别和作用详解(eAccelerator、memcached、xcache、APC )
2016/07/09 PHP
24条货真价实的PHP代码优化技巧
2016/07/28 PHP
php中实现进程锁与多进程的方法
2016/09/18 PHP
javascript实现二分查找法实现代码
2007/11/12 Javascript
通过JS 获取Mouse Position(鼠标坐标)的代码
2009/09/21 Javascript
ASP.NET jQuery 实例13 原创jQuery文本框字符限制插件-TextArea Counter
2012/02/03 Javascript
JavaScript 实现鼠标拖动元素实例代码
2014/02/24 Javascript
Jquery全选与反选点击执行一次的解决方案
2015/08/14 Javascript
js强制把网址设为默认首页
2015/09/29 Javascript
微信小程序 PHP生成带参数二维码
2017/02/21 Javascript
node.js实现回调的方法示例
2017/03/01 Javascript
使用openSpeDiv方法实现Ecshop登录弹窗框效果
2017/03/13 Javascript
微信小程序动态的加载数据实例代码
2017/04/14 Javascript
JSON对象转化为字符串详解
2017/08/11 Javascript
JQuery 又谈ajax局部刷新
2017/11/27 jQuery
p5.js入门教程之平滑过渡(Easing)
2018/03/16 Javascript
NodeJS 中Stream 的基本使用
2018/07/30 NodeJs
vue router的基本使用和配置教程
2018/11/05 Javascript
js中apply和call的理解与使用方法
2019/11/27 Javascript
Python3中使用PyMongo的方法详解
2017/07/28 Python
解决Python pandas df 写入excel 出现的问题
2018/07/04 Python
python 实现识别图片上的数字
2019/07/30 Python
对Pytorch神经网络初始化kaiming分布详解
2019/08/18 Python
Pytorch 多维数组运算过程的索引处理方式
2019/12/27 Python
TensorFlow MNIST手写数据集的实现方法
2020/02/05 Python
Python pandas如何向excel添加数据
2020/05/22 Python
Django celery异步任务实现代码示例
2020/11/26 Python
英国最受欢迎的手表网站:Watch Shop
2016/10/21 全球购物
极简鞋类,赤脚的感觉:Lems Shoes
2019/08/06 全球购物
写好求职应聘自荐信的三部曲
2013/09/21 职场文书
毕业自我鉴定书
2014/03/24 职场文书
寒山寺导游词
2015/02/03 职场文书
PostgreSQL存储过程实用脚本(二):创建函数入门
2021/04/05 PostgreSQL
Redis Cluster集群动态扩容的实现
2021/07/15 Redis