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 "