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/tax123@172.*.*.*: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 "

 

更多推荐