用python導入文本和Oracle數據到MySQL
目錄
一、了解數據
二、文本數據導入到MySQL
三、Oracle數據導入到MySQL
三、總結
【工具】
Anaconda+Python 3.6+jupyterlab
MySQL
Oracle 10
【注】
本文假設你已安裝好MySQL數據庫
本文背景:項目中有一個數據庫,存放了歷史的用戶訂購數據,原數據庫為Oracle,感覺性能不好,為了更好配合后續的數據自動化導入和python分析及報表生成,把原來oracle數據遷移到mysql數據庫,文中重點介紹方法,數據源均為測試源,讀者可以自行修改為自己的數據。
一、了解數據
要處理的數據格式為文本文件,以”|“分割,字段為(各字段含義,百度IPTV c3規范):
樣例:
userid001|20171231123820|20171231123820|20180130123820|2|28元包月訂購|productIDa123|800|5|瘋狂的外星人|mediacode001|
userid002|20171231145639|20171231145639|20180130145639|2|6元整部訂購|productIDa456|600|5|流浪地球|mediacode002|
userid003|20171231152518|20171231152518|20180130152518|2|6元整部訂購|productIDa123|600|5|海王|mediacode003|
userid004|20171231184705|20171231184705|20180130184705|2|6元整部訂購|productIDa123|600|5|西虹市首富|mediacode004|
userid005|20171231194250|20171231194250|20180130194250|2|28元包月訂購|productIDa456|800|5|紅海行動|mediacode005|
userid006|20171231215439|20171231215439|20180130215439|2|28元包月訂購|productIDa456|500|5|龍貓|mediacode006|
userid007|20171231215219|20171231215219|20180130215219|2|6元整部訂購|productIDa123|600|5|戰狼|mediacode007|
二、文本文件導入數據庫
1.建表:在MySQL數據庫中建立orderlog_demo的表,字段參考上文,方法略去
2.導入數據
表已經創建成功,第一部分從orderlog_demo.txt中導入數據到MySQL
a.導入需要使用的庫,oracle使用的也提前導入
#導入需要使用到的庫
from sqlalchemy import create_engine #連接mysql使用
import pandas as pdfrom sqlalchemy.types
import Integer,NVARCHAR,Float
import cx_Oracle #連接oracle使用
import datetime
import time
b.#設置讀取文件的表頭名稱
col_names = ['USERID','PURCHASETIME','VALIDTIME','EXPIREDTIME','PRODUCTTYPE','PRODUCTNAME','PRODUCTID','PRICE','ORDERTYPE','CONTENTNAME','MEDIACODE','Info']
c.從orderlog導入數據到df
#從orderlog導入數據到df df = pd.read_csv('./res/Orderlog_demo.txt',sep='|',dtype = 'str',encoding = 'GB2312',names=col_names)
d.#較驗讀取的文件長度,檢查文件是否讀取完整
#較驗讀取的文件是否完成 print(len(df))
e.設置mysql連接引擎
#設置mysql連接引擎 engine = create_engine('mysql+pymysql://orderlog:password@192.168.1.99:3306/orderlog?charset=utf8')
f.df文本格式和數據庫文本格式轉換函數
#df文本格式和數據庫文本格式轉換函數 def mapping_df_types(df): dtypedict = {} for i, j in zip(df.columns, df.dtypes): print(i,j) if "object" in str(j): dtypedict.update({i: NVARCHAR(length=255)}) #print("True") if "float" in str(j): dtypedict.update({i: Float(precision=2, asdecimal=True)}) if "int" in str(j): dtypedict.update({i: Integer()}) return dtypedict
g.把df列格式轉換成數據庫格式
#把df列格式轉換成數據庫格式 dtypedict = mapping_df_types(df)
h.df保存到mysql,並打印執行時間
#df保存到mysql,並打印執行時間 starttime = datetime.datetime.now() df.to_sql('orderlog_demo',engine,dtype=dtypedict,index=False,if_exists='append') endtime = datetime.datetime.now() print((endtime - starttime).seconds)
i.較驗MySQL庫導入是否成功,文本文件導入MySQL完成
三、Oracle數據導入MySQL
獲取Oracle數據
1.設置oracle連接參數
#以下部分為從oracle數據庫中讀取數據,並導入到mysql中#設置oracle連接參數 dsn=cx_Oracle.makedsn("192.168.254.166",1521,"orcl")#ip,端口,庫名 conn=cx_Oracle.connect("system","password",dsn)
#設置要導入數據,為防止執行時間過長,分月導入 month_lst=(['201901%','201902%'])print(len(month_lst))
2.按月導入數據到MYSQL,並打印執行時間
#按月導入數據到MYSQL for month in month_lst: starttime = datetime.datetime.now() #從oracle數據庫里查詢對應月份數據,保存到df中 sqlcmd="select * from orderlog where purchasetime like " +'\''+ month+'\'' df=pd.read_sql(sqlcmd,conn) #df保存到mysql df.to_sql('orderlog_demo',engine,dtype=dtypedict,index=False,if_exists='append') endtime = datetime.datetime.now() print("導入"+month[:-1]+"耗時"+str((endtime - starttime).seconds)+"秒") time.sleep(10) #休息10s 個人調試加入,生產可以不需要print("All Finished")
3.最后較驗源數據庫和目標數據庫數據是否正確(以201902為例)a.源庫
b.目標庫
至此文本文件導入和Oracle數據導入完成
四、總結
本文介紹了數據庫系統的優勢,如何用Python連接數據庫並導入文本數據和Oracle數據庫數據。
TIPS:
寫demo的過程中遇到過兩個問題,也寫在總結里供參考:
-
文本文件讀取時的字符集,本文為GB2312,python默認為utf-8,本文未做特殊處理,本人也是遇到問題后,百度的。
-
Oracle連接時遇到”Cannot locate a 64-bit Oracle Client library“ \xxx\bin\oci.dll找不到的問題,是因為缺少64位版本,百度后解決。
-
從Oracle數據庫導入時,如果數據量很大最好分月或分天導入,這樣程度才不會因為一次執行時間很長卡死。
遇到問題,百度一下