天天看點

用python3腳本實作Oracle資料導出成csv并導入到Mysql(Oracle到MySQL資料遷移方法)

1. 背景

有一個Oracle資料庫,需要進行資料遷移到MySQL中,但是編碼出現問題,無法實作Navicat直接,是以利用的思想是将Oracle資料導出成csv檔案,再利用Navicate導入到MySQL中即可

2. 處理方式

先進行配置Oracle資料庫配置,使用以下代碼

pip install cx_Oracle
           

3. 進行配置

import cx_Oracle
import csv
import os
os.environ["NLS_LANG"] = "SIMPLIFIED CHINESE_CHINA.AL32UTF8"

def connection(sql):
    db = cx_Oracle.connect('TAX/[email protected].*.*.*:1521/tax')
    # TAX是Oracle資料庫名稱,tax123是賬戶名稱,172.*.*.*是主機位址,1521是端口号,tax是協定名稱
    cursor = db.cursor()
    cursor.execute(sql)
    data = cursor.fetchall()
    cursor.close()
    db.close()
    return data
           

4.進行測試

sql ="SELECT * FROM TAX.AA_FPCGL_2014 WHERE rownum<5"
print(connection(sql))
           

運作即可出結果

5.進行存儲到csv檔案,分兩步,第一步先導出一個列名稱,第二步導出資料

第一步:

def write_head(data):
    with open("AA_FPCGL_2014.csv", 'a', newline='') as f:
        # f_csv = csv.writer(f)
        line = ",".join(title[0] for title in data)
        line += ','
        line += "\n"
        f.write(line)
    return "表頭已經寫入完畢"
           

第二步:

def write_rows(data):
    with open("AA_FPCGL_2014.csv", 'a', encoding='utf-8', newline='') as f:
        f_csv = csv.writer(f)
        for i in data:
            writer = f_csv.writerow(i)
    return "表行已經寫入完畢"
           

6. 寫sql,調用上述函數

# 找出表名稱為AA_FPCGL_2014所有列,前面COLUMN_NAME,和user_tab_columns是内置屬性不用管
sql = "select COLUMN_NAME  from user_tab_columns  where Table_Name='AA_FPCGL_2014'"

# 找出表中所有資料
sql1 = "SELECT * FROM TAX.AA_FPCGL_2014"

# 調用連接配接,拿到表頭資料
Head_Info = connection(sql)

mesg = write_head(Head_Info)
print(mesg)

# 調用連接配接,拿到表中資料
Rows_Info = connection(sql1)

mesg = write_rows(Rows_Info)
print(mesg)
           

7.踩坑

由于資料庫資料較髒,資料有些字段亂七八糟,最後再讀取過程中報錯ORA-29275:部分多位元組字元,不要擔心,其實是字元問題(本機字元集與資料源機字元不同),我也不知道在哪,管他三七二十一,統一轉成字元就行,于是更改第二個sql

sql1 = "SELECT 
TO_SINGLE_BYTE(SWJG_DM),
TO_SINGLE_BYTE(BS_NSRSBH),
TO_SINGLE_BYTE(KPJH),
TO_SINGLE_BYTE(BSYF),
TO_SINGLE_BYTE(FPDM),
TO_SINGLE_BYTE(FPHM),
TO_SINGLE_BYTE(GF_NSRSBH),
TO_SINGLE_BYTE(XF_NSRSBH),
TO_SINGLE_BYTE(JE),
TO_SINGLE_BYTE(SE),
TO_SINGLE_BYTE(KPRQ),
TO_SINGLE_BYTE(ZFBZ),
TO_SINGLE_BYTE(BDBZ),
TO_SINGLE_BYTE(ZS_FPDM),
TO_SINGLE_BYTE(ZS_FPHM),
TO_SINGLE_BYTE(BSFS),
TO_SINGLE_BYTE(BSSJ),
TO_SINGLE_BYTE(CZY_DM),
TO_SINGLE_BYTE(CZY_MC),
TO_SINGLE_BYTE(BLBZ),
TO_SINGLE_BYTE(CRC),
TO_SINGLE_BYTE(CCBZ),
TO_SINGLE_BYTE(FP_LB),
TO_SINGLE_BYTE(NSR_XZ),
TO_SINGLE_BYTE(SL),
TO_SINGLE_BYTE(PACKEDTAG),
TO_SINGLE_BYTE(XDJG),
TO_SINGLE_BYTE(XF_QYMC),
TO_SINGLE_BYTE(GF_QYMC),
TO_SINGLE_BYTE(QD_BZ),
TO_SINGLE_BYTE(BL_LB),
TO_SINGLE_BYTE(CZDATE),
TO_SINGLE_BYTE(CZDATE_CHAR),
TO_SINGLE_BYTE(XHQD_BZ),
TO_SINGLE_BYTE(JSHJ),
TO_SINGLE_BYTE(JQBH),
TO_SINGLE_BYTE(FP_MW),
TO_SINGLE_BYTE(JYM),
TO_SINGLE_BYTE(SKR),
TO_SINGLE_BYTE(FHR),
TO_SINGLE_BYTE(KPR),
TO_SINGLE_BYTE(BZ),
TO_SINGLE_BYTE(GFYHZH),
TO_SINGLE_BYTE(XFYHZH),
TO_SINGLE_BYTE(GFDZDH),
TO_SINGLE_BYTE(XFDZDH),
TO_SINGLE_BYTE(KJLX),
TO_SINGLE_BYTE(ZFSJ),
TO_SINGLE_BYTE(WSPZH),
TO_SINGLE_BYTE(FPQM),
TO_SINGLE_BYTE(XXBBH),
TO_SINGLE_BYTE(BL_CZY_MC),
TO_SINGLE_BYTE(BLSJ),
TO_SINGLE_BYTE(TSPZBZ),
TO_SINGLE_BYTE(FPQM_STATUS),
TO_SINGLE_BYTE(CSQJ),
TO_SINGLE_BYTE(DK_NSRSBH),
TO_SINGLE_BYTE(DK_QYMC),
TO_SINGLE_BYTE(SPBMBBH),
TO_SINGLE_BYTE(SLBS)
FROM TAX.AA_FPCGL_2014 "