用python3脚本实现Oracle数据导出成csv并导入到Mysql(Oracle到MySQL数据迁移方法)
1. 背景有一个Oracle数据库,需要进行数据迁移到MySQL中,但是编码出现问题,无法实现Navicat直接,因此利用的思想是将Oracle数据导出成csv文件,再利用Navicate导入到MySQL中即可2. 处理方式先进行配置Oracle数据库配置,使用以下代码pip install cx_Oracle3. 进行配置import cx_Oracleimport...
·
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 "
更多推荐
已为社区贡献1条内容
所有评论(0)