rucoding 2022-06-30 21:25 采纳率: 66.7%
浏览 102
已结题

利用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)
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
  • muyu9527 2022-06-30 22:09
    关注

    我也经常有此类需求,建议:

    1. 执行SQL,改用pymysql的read_sql方法;
    2. 输出excel,改用to_excel方法;
    import pymysql.cursors
    
    # 数据库配置
    config = {
        'host': '',
        'port': 3306,
        'user': '',
        'password': '',
        'charset': 'utf8mb4',
        'cursorclass': pymysql.cursors.DictCursor,
    }
    
    conn = pymysql.connect(**config)
    sql_data = pd.read_sql(sql, conn) # SQL是本地读入的SQL文本
    conn.close()
    
    # 输出为excel文件
    out_path = path + file_name # path是文件路径,file_name是输出文件名
    writer = pd.ExcelWriter(out_path, engine='xlsxwriter')
    result.to_excel(writer, index=None)
    writer.save()
    
    评论
  • MrTangLY 2022-06-30 23:50
    关注

    数据库关闭或没有响应!端口是否为1521,192.168.1.131:1521

    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

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

悬赏问题

  • ¥30 计算机网络子网划分路由模拟操作
  • ¥15 MATLAB的画图问题
  • ¥15 c语言用fopen_s成功打开文件之后闪退
  • ¥20 用C++完成,并且运用数组
  • ¥30 求解电力系统潮流计算结果不收敛问题
  • ¥15 某易易盾点选data解析逆向
  • ¥15 系统崩溃,关于订单的处理
  • ¥15 datax-web连接hive为数据源时发生报错,如何解决?
  • ¥15 plink在进行gwas分析时总读取不到表型
  • ¥20 数据结构与c语言的实践内容