python通过SSH连接Oracle/Mysql数据库并导出到Excel

本文介绍如何使用Python的sshtunnel和cx_Oracle库,通过SSH隧道从远程跳板机安全地连接到Oracle数据库,并将查询结果导出为Excel文件。此方法适用于需要跨防火墙或在不开放直接数据库连接的情况下进行数据提取的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

----------------------------------------------------------------------

                            |
-------------+              |    +----------+               +---------
    LOCAL    |              |    |  REMOTE  |               | PRIVATE
    CLIENT   | <== SSH ========> |  SERVER  | <== local ==> | SERVER
-------------+              |    +----------+               +---------
                            |    中间跳板机                  数据库服务器
                    FIREWALL (only port 10022 is open)

----------------------------------------------------------------------
#!/usr/bin/env python
#coding:utf-8
import cx_Oracle
import xlsxwriter
import time
from sshtunnel import SSHTunnelForwarder

userInfo = '数据库用户名/密码'
dbStr = '@PRIVATE SERVER IP:1521/数据库服务名'
connstr = userInfo + dbStr


LOCAL_PORT = 38399
DSN = "数据库用户名/密码@localhost:%d/dbcenter" %LOCAL_PORT

########不通过ssh来连接Oracle数据库直接用以下语句即可
#con = cx_Oracle.connect(connstr)



#数据库语句
sql ='''
     select * from TMP
     '''


#######通过ssh中间跳板机来连接Oracle数据库
with SSHTunnelForwarder(
         ('REMOTE SERVER IP', 10022),                     #远程中间跳板机器的配置
         ssh_password="root",
         ssh_username="root",
         remote_bind_address=("PRIVATE SERVER IP", 1521), #远程数据库所在机器配置
         local_bind_address=("127.0.0.1", LOCAL_PORT)    #本地转发接口配置,与DSN的配置相关
         ) as server:


        #如果是Mysql数据库则用以下连接
        # conn = MySQLdb.connect(host='127.0.0.1',        #此处必须是是127.0.0.1
        #                        port=server.local_bind_port,
        #                        user='user',
        #                        passwd='password',
        #                        db='dbname')
       print("sshConnectSuccess")
       con = cx_Oracle.connect(DSN)

       cursor = con.cursor()
       query1 = cursor.execute(sql)
       title = [i[0] for i in query1.description]
       date_now = time.strftime("%Y%m%d", time.localtime())

       #name and path
       report_name = "数据" + date_now + '.xlsx'
       #生成xlsx格式oracle查询统计报表
       workbook = xlsxwriter.Workbook(report_name, {'default_date_format': 'yyyy-mm-dd'})
       worksheet = workbook.add_worksheet()
       data = cursor.fetchall()
       worksheet.write_row(0, 0, title)
       for row, row_data in enumerate(data):
            worksheet.write_row(row+1, 0, row_data)
       cursor.close()
       con.close()
       workbook.close()



参考文章

【1】https://pypi.org/project/sshtunnel/#description

【2】https://www.cnblogs.com/luyingfeng/p/6386093.html

【3】https://github.com/oracle/python-cx_Oracle/issues/158

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值