前言:
這期間有研究了Django網(wǎng)頁(yè)制作過(guò)程中,如何將數(shù)據(jù)批量導(dǎo)入到數(shù)據(jù)庫(kù)中.
這個(gè)過(guò)程真的是慘不忍睹,犯了很多的低級(jí)錯(cuò)誤,這會(huì)在正文中說(shuō)到的.再者導(dǎo)入數(shù)據(jù)用的是py腳本,腳本內(nèi)容參考至自強(qiáng)學(xué)堂--中級(jí)教程--數(shù)據(jù)導(dǎo)入.
注:本文主要介紹自己學(xué)習(xí)的經(jīng)驗(yàn)總結(jié),而非教程!
正文:首先說(shuō)明采用Django中bulk_create()函數(shù)來(lái)實(shí)現(xiàn)數(shù)據(jù)批量導(dǎo)入功能,為什么會(huì)選擇它呢?
1 bulk_create()是執(zhí)行一條SQL存入多條數(shù)據(jù),使得導(dǎo)入速度更快;
2 bulk_create()減少了SQL語(yǔ)句的數(shù)量;
然后,我們準(zhǔn)備需要導(dǎo)入的數(shù)據(jù)源,數(shù)據(jù)源格式可以是xls,csv,txt等文本文檔;
最后,編寫py腳本,運(yùn)行即可!
py腳本如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
#coding:utf-8 import os os.environ.setdefault( "DJANGO_SETTINGS_MODULE" , "www.settings" ) ''' Django 版本大于等于1.7的時(shí)候,需要加上下面兩句 import django django.setup() 否則會(huì)拋出錯(cuò)誤 django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet. ''' import django import datetime if django.VERSION > = ( 1 , 7 ): #自動(dòng)判斷版本 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( ';' ) #按;對(duì)字符串進(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腳本源代碼主要來(lái)說(shuō)說(shuō)自己學(xué)習(xí)過(guò)程中遇見的問(wèn)題
問(wèn)題1:需要導(dǎo)入的數(shù)據(jù)源中其第一行一般是字段名,從第二行開始才是數(shù)據(jù),所以在腳本利用next(f)將文本標(biāo)記移到第二行進(jìn)行操作,不然會(huì)出現(xiàn)問(wèn)題,比如字段名一般為英文,默認(rèn)是字符串格式化,腳本執(zhí)行就會(huì)遇見ValidationError:YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]這種models數(shù)據(jù)格式與導(dǎo)入數(shù)據(jù)格式不相符合的錯(cuò)誤!
問(wèn)題2:注意parts = parts.split(';') #按;對(duì)字符串進(jìn)行切片該語(yǔ)句,因?yàn)槲覀儗?dǎo)入數(shù)據(jù)每一行中的每列數(shù)據(jù)之間有間隔符,例如csv中逗號(hào),xls中空格等各種文本默認(rèn)間隔符號(hào),split函數(shù)使用實(shí)例如下:
以下實(shí)例展示了split()函數(shù)的使用方法:
1
2
3
4
5
|
#!/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']
問(wèn)題3:如果導(dǎo)入數(shù)據(jù)源超過(guò)10M,然后數(shù)據(jù)庫(kù)默認(rèn)最大10M,那么上面腳本運(yùn)行不會(huì)成功.以mysql為例,若導(dǎo)入數(shù)據(jù)大小超過(guò)數(shù)據(jù)設(shè)置,那么會(huì)報(bào)2006 go away錯(cuò)誤,需要在mysql中的my.ini中的[mysqld]下加入下列語(yǔ)句:
1
2
3
|
max_allowed_packet = 300M - - 最大允許包大小 300M wait_timeout = 200000 - - 連接時(shí)間 200000s interactive_timeout = 200000 - - 斷開時(shí)間 200000s |
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家學(xué)習(xí)python批量導(dǎo)入數(shù)據(jù)有所幫助。