You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中编写函数创建Oracle连接的代码报错如何修正

代码问题排查与修正方案

你写的Oracle连接函数共有3处核心错误、2处缺失的必要逻辑,具体说明和修正方法如下:

现存错误

  • 连接字符串未使用传入参数:cx_Oracle.connect('user/passwd@SID') 里的user/passwd@SID是固定字符串,完全没有用到函数传入的user、passwd、SID三个参数,运行时会尝试用账号user、密码passwd连接SID为SID的库,和你传入的实际参数完全不匹配,是连接失败的核心原因。哪怕手动拼接,也需要用f-string写成f"{user}/{passwd}@{SID}"的形式,但这种写法在账号密码包含@、/等特殊字符时会出现连接串解析错误,不推荐使用。
  • 存在资源泄漏风险:代码执行完查询后没有关闭游标、数据库连接,多次调用会持续占用数据库连接资源,最终触发连接数超限错误。
  • 缺失异常处理逻辑:连接失败、SQL语法错误、权限不足等场景下会直接抛出未处理的异常,也无法在出错时释放已创建的资源。

修正方法

  1. 优先使用cx_Oracle.makedsn构造数据源连接串,避免账号密码包含特殊字符时连接串解析失败,不要手动拼接连接字符串。
  2. 用上下文管理器(with语法)自动管理连接、游标生命周期,无需手动写close逻辑,哪怕执行出错也能自动释放资源。
  3. 增加基础异常捕获,方便快速定位问题。

修正后可运行代码

import cx_Oracle

def sqlconnect(user, passwd, SID, query):
    # 构造DSN,默认端口1521,若你的库端口不同可自行修改
    dsn = cx_Oracle.makedsn('127.0.0.1', 1521, sid=SID)
    try:
        # 上下文管理器自动管理连接和游标,无需手动关闭
        with cx_Oracle.connect(user=user, password=passwd, dsn=dsn) as conn:
            with conn.cursor() as cursor:
                cursor.execute(query)
                res = cursor.fetchall()
                return res
    except cx_Oracle.Error as e:
        print(f"数据库操作出错: {e}")
        return None

if __name__ == '__main__':
    result = sqlconnect('user','password','XEE','select * from dual')
    print(result)

注意:如果你的Oracle服务是用服务名(Service Name)而不是SID连接的,把makedsn里的sid=SID改成service_name=SID即可。

内容的提问来源于stack exchange,提问作者ashish_k

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.18 16:15:44