python Django批量導(dǎo)入數(shù)據(jù)
前言:
這期間有研究了Django網(wǎng)頁制作過程中,如何將數(shù)據(jù)批量導(dǎo)入到數(shù)據(jù)庫中.
這個過程真的是慘不忍睹,犯了很多的低級錯誤,這會在正文中說到的.再者導(dǎo)入數(shù)據(jù)用的是py腳本,腳本內(nèi)容參考至自強(qiáng)學(xué)堂--中級教程--數(shù)據(jù)導(dǎo)入.
注:本文主要介紹自己學(xué)習(xí)的經(jīng)驗(yàn)總結(jié),而非教程!
正文:首先說明采用Django中bulk_create()函數(shù)來實(shí)現(xiàn)數(shù)據(jù)批量導(dǎo)入功能,為什么會選擇它呢?
1 bulk_create()是執(zhí)行一條SQL存入多條數(shù)據(jù),使得導(dǎo)入速度更快;
2 bulk_create()減少了SQL語句的數(shù)量;
然后,我們準(zhǔn)備需要導(dǎo)入的數(shù)據(jù)源,數(shù)據(jù)源格式可以是xls,csv,txt等文本文檔;
最后,編寫py腳本,運(yùn)行即可!
py腳本如下:
#coding:utf-8 import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "www.settings") ''' Django 版本大于等于1.7的時(shí)候,需要加上下面兩句 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) #將文件標(biāo)記移到下一行 for line in f: parts = line.replace('"','') #將字典中的"替換空 parts = parts.split(';') #按;對字符串進(jìn)行切片 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)
根據(jù)上面py腳本源代碼主要來說說自己學(xué)習(xí)過程中遇見的問題
問題1:需要導(dǎo)入的數(shù)據(jù)源中其第一行一般是字段名,從第二行開始才是數(shù)據(jù),所以在腳本利用next(f)將文本標(biāo)記移到第二行進(jìn)行操作,不然會出現(xiàn)問題,比如字段名一般為英文,默認(rèn)是字符串格式化,腳本執(zhí)行就會遇見ValidationError:YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]這種models數(shù)據(jù)格式與導(dǎo)入數(shù)據(jù)格式不相符合的錯誤!
問題2:注意parts = parts.split(';') #按;對字符串進(jìn)行切片該語句,因?yàn)槲覀儗?dǎo)入數(shù)據(jù)每一行中的每列數(shù)據(jù)之間有間隔符,例如csv中逗號,xls中空格等各種文本默認(rèn)間隔符號,split函數(shù)使用實(shí)例如下:
以下實(shí)例展示了split()函數(shù)的使用方法:
#!/usr/bin/python str = "Line1-abcdef \nLine2-abc \nLine4-abcd"; print str.split( ); print str.split(' ', 1 );
以上實(shí)例輸出結(jié)果如下:
['Line1-abcdef', 'Line2-abc', 'Line4-abcd']
['Line1-abcdef', '\nLine2-abc \nLine4-abcd']
問題3:如果導(dǎo)入數(shù)據(jù)源超過10M,然后數(shù)據(jù)庫默認(rèn)最大10M,那么上面腳本運(yùn)行不會成功.以mysql為例,若導(dǎo)入數(shù)據(jù)大小超過數(shù)據(jù)設(shè)置,那么會報(bào)2006 go away錯誤,需要在mysql中的my.ini中的[mysqld]下加入下列語句:
max_allowed_packet=300M --最大允許包大小300M wait_timeout=200000 --連接時(shí)間200000s interactive_timeout = 200000 --斷開時(shí)間200000s
以上就是本文的全部內(nèi)容,希望對大家學(xué)習(xí)python批量導(dǎo)入數(shù)據(jù)有所幫助。
- 使用python將excel數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫過程詳解
- 用Python將Excel數(shù)據(jù)導(dǎo)入到SQL Server的例子
- Python 中導(dǎo)入csv數(shù)據(jù)的三種方法
- Python之csv文件從MySQL數(shù)據(jù)庫導(dǎo)入導(dǎo)出的方法
- python批量導(dǎo)入數(shù)據(jù)進(jìn)Elasticsearch的實(shí)例
- Python實(shí)現(xiàn) 多進(jìn)程導(dǎo)入CSV數(shù)據(jù)到 MySQL
- python Django批量導(dǎo)入不重復(fù)數(shù)據(jù)
- Python制作數(shù)據(jù)導(dǎo)入導(dǎo)出工具
- Python導(dǎo)入oracle數(shù)據(jù)的方法
- python 導(dǎo)入數(shù)據(jù)及作圖的實(shí)現(xiàn)
相關(guān)文章
python數(shù)據(jù)擬合之scipy.optimize.curve_fit解讀
這篇文章主要介紹了python數(shù)據(jù)擬合之scipy.optimize.curve_fit解讀,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12基于python實(shí)現(xiàn)對文件進(jìn)行切分行
這篇文章主要介紹了基于python實(shí)現(xiàn)對文件進(jìn)行切分行,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04python?實(shí)現(xiàn)?redis?數(shù)據(jù)庫的操作
這篇文章主要介紹了python?包?redis?數(shù)據(jù)庫的操作教程,redis?是一個?Key-Value?數(shù)據(jù)庫,下文基于python的相關(guān)資料展開對redis?數(shù)據(jù)庫操作的詳細(xì)介紹,需要的小伙伴可以參考一下2022-04-04解決django model修改添加字段報(bào)錯的問題
今天小編就為大家分享一篇解決django model修改添加字段報(bào)錯的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11Python面向?qū)ο蟪绦蛟O(shè)計(jì)OOP入門教程【類,實(shí)例,繼承,重載等】
這篇文章主要介紹了Python面向?qū)ο蟪绦蛟O(shè)計(jì)OOP入門教程,較為詳細(xì)的分析了Python面向?qū)ο箢?實(shí)例,繼承,重載等相關(guān)概念與使用技巧,需要的朋友可以參考下2019-01-01