Java智慧阁 2022-06-30 21:25 采纳率: 66.7%
浏览 108
已结题

利用Python自动化执行本地的多个sql脚本,导出excel数据

利用Python自动化执行本地的多个sql脚本,导出excel数据
代码如下
import cx_Oracle
import openpyxl
import os
import printFile

def export_excel(sql,fileName):
    rr = curs.execute(sql)
    rows = curs.fetchall()

    #获取字段名
    title = [ i[0] for i in curs.description ]

    #创建excel表
    wb = openpyxl.Workbook()
    ws = wb.active

    #插入字段名到第一行
    for c in range(len(title)):
        ws.cell(1,c+1,value = title[c])

    #写入查询数据
    for r in range(len(rows)):
        for c in range(len(rows[r])):
            if rows[r][c]: #值不为空时写入,空值不写入
                ws.cell(r+2,c+1,value=str(rows[r][c])) #str()防止用科学计数法写入造成信息丢失

    #保存sql脚本
    ws1 = wb.create_sheet('sql')
    ws1.cell(1,1,value=sql)

    wb.save(fileName)
    wb.close()
    curs.close()

# 定义函数
def getDBInfo(DIRECTORY,FILENAME):
    # 打开sql文件获取sql语句
    with open(DIRECTORY + "\\" + FILENAME, 'r', encoding='UTF-8') as sql_0:
        sql = sql_0.read()
        print(sql)
        export_excel(sql, 'book_' + FILENAME + '.xlsx')
    conn.close()

if __name__ == '__main__':
    conn = cx_Oracle.connect('test/123456789@192.168.1.131/orcl',encoding = 'utf-8') #utf-8显示中文
    curs= conn.cursor()
    # 调用函数
    DIRECTORY = 'F:\\sqlExecute'
    FILENAME = 'query2.sql'
    #getDBInfo(DIRECTORY,FILENAME)
    # 文件路径
    file_path = r'F:\\sqlExecute'
    # 提取文件中的所有文件生成一个列表
    folders = os.listdir(file_path)
    for file in folders:
        # 打印所有文件名
        print(file)
        getDBInfo(DIRECTORY,file)

运行结果及报错内容
query1.sql
SELECT
        a.email "电子邮件"
FROM
        test1 a
query2.sql
SELECT
        id AS "ID编号",
        name AS "名字",
        a.HIRE_DATE "日期",
        a.email "电子邮件"
FROM
        test1 a
Traceback (most recent call last):
  File ".\exportData2.py", line 59, in <module>
    getDBInfo(DIRECTORY,file)
  File ".\exportData2.py", line 42, in getDBInfo
    export_excel(sql, 'book_' + FILENAME + '.xlsx')
  File ".\exportData2.py", line 8, in export_excel
    rr = curs.execute(sql)
cx_Oracle.InterfaceError: not open

其他文件
--- query1.sql 
SELECT
    a.email "电子邮件"
FROM
    test1 a
--- query2.sql 
SELECT
    id AS "ID编号",
    name AS "名字",
    a.HIRE_DATE "日期",
    a.email "电子邮件"
FROM
    test1 a
我想要达到的结果

例如指定文件夹 F:\sqlExecute 有多个(n个)脚本 query1.sql 、query2.sql
导出结果就是本地生成两个(或多个)excel文件, query1.xlsx query2.xlsx

  • 写回答

3条回答 默认 最新

  • 溪风沐雪 2022-06-30 22:05
    关注

    因为没有Oracle数据库,没法测试,目测你的问题是没有把curs参数传递到export_excel函数中,简单的解决方案就是在getDBInfo和export_excel函数都加个参数curs,调用的时候把curs传递进去

    import cx_Oracle
    import openpyxl
    import os
    import printFile
     
    def export_excel(sql,fileName,curs):
        rr = curs.execute(sql)
        rows = curs.fetchall()
     
        #获取字段名
        title = [ i[0] for i in curs.description ]
     
        #创建excel表
        wb = openpyxl.Workbook()
        ws = wb.active
     
        #插入字段名到第一行
        for c in range(len(title)):
            ws.cell(1,c+1,value = title[c])
     
        #写入查询数据
        for r in range(len(rows)):
            for c in range(len(rows[r])):
                if rows[r][c]: #值不为空时写入,空值不写入
                    ws.cell(r+2,c+1,value=str(rows[r][c])) #str()防止用科学计数法写入造成信息丢失
     
        #保存sql脚本
        ws1 = wb.create_sheet('sql')
        ws1.cell(1,1,value=sql)
     
        wb.save(fileName)
        wb.close()
        curs.close()
     
    # 定义函数
    def getDBInfo(DIRECTORY,FILENAME,curs):
        # 打开sql文件获取sql语句
        with open(DIRECTORY + "\\" + FILENAME, 'r', encoding='UTF-8') as sql_0:
            sql = sql_0.read()
            print(sql)
            export_excel(sql, 'book_' + FILENAME + '.xlsx',curs)
        conn.close()
     
    if __name__ == '__main__':
        conn = cx_Oracle.connect('test/123456789@192.168.1.131/orcl',encoding = 'utf-8') #utf-8显示中文
        curs= conn.cursor()
        # 调用函数
        DIRECTORY = 'F:\\sqlExecute'
        FILENAME = 'query2.sql'
        #getDBInfo(DIRECTORY,FILENAME)
        # 文件路径
        file_path = r'F:\\sqlExecute'
        # 提取文件中的所有文件生成一个列表
        folders = os.listdir(file_path)
        for file in folders:
            # 打印所有文件名
            print(file)
            getDBInfo(DIRECTORY,file,curs)
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 7月8日
  • 已采纳回答 6月30日
  • 创建了问题 6月30日

悬赏问题

  • ¥15 Arduino,利用modbus的RS485协议,进行对外置的温湿度传感器进行数据读取
  • ¥15 vhdl+MODELSIM
  • ¥20 simulink中怎么使用solve函数?
  • ¥30 dspbuilder中使用signalcompiler时报错Error during compilation: Fitter failed,求解决办法
  • ¥15 gwas 分析-数据质控之过滤稀有突变中出现的问题
  • ¥15 没有注册类 (异常来自 HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
  • ¥15 知识蒸馏实战博客问题
  • ¥15 用PLC设计纸袋糊底机送料系统
  • ¥15 simulink仿真中dtc控制永磁同步电机如何控制开关频率
  • ¥15 用C语言输入方程怎么