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

利用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条回答 默认 最新

      报告相同问题?

      相关推荐 更多相似问题

      问题事件

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

      悬赏问题

      • ¥15 关于用matlab进行光束整形的问题
      • ¥15 vs code编译器 C语言刚学,想的有点复杂
      • ¥15 航班订票系统函数无法运行
      • ¥20 VS2022无法启动程序,如何解决?(语言-c++|开发工具-visual studio)
      • ¥15 c语言可以做出完整的吗有人看看吗
      • ¥15 电脑流氓插件处理方法
      • ¥15 问一下这个可调恒流源电路用哪个电源接口比较好,想用tapec接口仅作为电源接口这个引脚怎么连啊
      • ¥30 Abaqus做建模的时候网格没办法收敛是为什么?
      • ¥15 车牌识别摄像镜头,httppost,nodejs
      • ¥20 腾讯云托管与本地测试 GET请求获取返回值 完全不同