用python導入文本和Oracle數據到MySQL


用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的過程中遇到過兩個問題,也寫在總結里供參考:

  1. 文本文件讀取時的字符集,本文為GB2312,python默認為utf-8,本文未做特殊處理,本人也是遇到問題后,百度的。

  2. Oracle連接時遇到”Cannot locate a 64-bit Oracle Client library“  \xxx\bin\oci.dll找不到的問題,是因為缺少64位版本,百度后解決。

  3. 從Oracle數據庫導入時,如果數據量很大最好分月或分天導入,這樣程度才不會因為一次執行時間很長卡死。

遇到問題,百度一下


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM