虽然可以用Kettle等ETL工具将数据库查询结果导出为EXCEL,CSV,TSV格式
但是Kettle等ETL工具导出效率太慢,实测本人写的Python脚本导出效率快高出Kettle一倍
import cx_Oracle
import os
import csv
import time
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8' #避免中文乱码
conn = cx_Oracle.connect('scott/[email protected]/orcl') #使用scott/tiger 连接到192.168.3.13
cur = conn.cursor() #定义一个游标用来执行DDL,DML,SELECT语句
cur.arraysize = 1000 #提升SELECT返回大量数据性能
header=[] #定义一个list变量用来保存表头
table_name=input("请输入要导出的表名:") #从键盘获取要导出的表名称
ifwriteheader=input("是否导出表头(y,n):") #从键盘获取是否导出表头,y表示导出表头,n表示不导出表头
cur.execute('select * from '+table_name+' where 1=0') #执行SELECT,获取表结构
for col_len in range(0,len(cur.description)): #循环遍历
header.append(cur.description[col_len][0]) #将表头添加到变量header
cur.execute('select * from '+table_name) #执行SELECT
print('开始导出:',time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
with open('csvfile.txt','w',newline='')as csvfile: #csvfile.txt改成csvfile.csv表示导出为excel 如果不加newline='' 每导出一行就有空的行
if ifwriteheader=='y':
writer= csv.DictWriter(csvfile,fieldnames=header) #用来写表头
writer.writeheader() #用来写表头
file = csv.writer(csvfile,delimiter=',') #delimiter默认是’,‘ 如果delimiter=' ' 表示导出为tsv
while True:
rows=cur.fetchmany() #每次获取cur.arraysize行数据
file.writerows(list(rows))
if not rows:
break #中断循环
cur.close() #关闭游标
conn.close() #关闭连接
print('导出完成:',time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
想不想成为SQL大神?想不想精通SQL优化,精通所有关系型数据库优化?
加我微信692162374 报名单独辅导 , 顺带我还可以教你Python,Oracle,MySQL,以及大数据