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

使用SqlAlchemy+oracledb连接Oracle时遇DPI-1047/DPY-4027错误求助

问题描述

使用SqlAlchemy(可搭配SqlModel)结合oracledb库连接Oracle数据库,参考代码如下:

from sqlalchemy.engine import create_engine

import sys
import oracledb
oracledb.version = "8.3.0"
sys.modules["cx_Oracle"] = oracledb

DIALECT = 'oracle'
SQL_DRIVER = 'cx_oracle'
USERNAME = 'your_username' #enter your username
PASSWORD = 'your_password' #enter your password
HOST = 'subdomain.domain.tld' #enter the oracle db host url
PORT = 1521 # enter the oracle port number
SERVICE = 'your_oracle_service_name' # enter the oracle db service name
ENGINE_PATH_WIN_AUTH = DIALECT + '+' + SQL_DRIVER + '://' + USERNAME + ':' + PASSWORD +'@' + HOST + ':' + str(PORT) + '/?service_name=' + SERVICE

engine = create_engine(ENGINE_PATH_WIN_AUTH)

连接时出现DPI-1047错误,后续触发**(oracledb.exceptions.DatabaseError) DPY-4027**异常,需排查解决。

解决步骤

1. 切换oracledb Thick模式

默认oracledb用Thin模式,若环境存在Oracle客户端库,切换到Thick模式可解决多数DPI相关错误。在代码中添加初始化逻辑:

import oracledb
# 指定Oracle客户端库路径,环境变量已配置可省略此参数
oracledb.init_oracle_client(lib_dir="/path/to/oracle/client/lib")

注意:

  • 客户端版本需与Oracle服务器版本兼容,推荐用19c及以上版本的Instant Client
  • Windows需下载对应版本Instant Client解压,Linux可通过包管理器或官网安装

2. 修正连接字符串格式

移除不必要的版本设置,用oracledb官方方法生成标准DSN,避免手动拼接出错:

from sqlalchemy.engine import create_engine
import oracledb
import sys

sys.modules["cx_Oracle"] = oracledb
# 初始化Thick模式(按需添加)
oracledb.init_oracle_client(lib_dir="/path/to/oracle/client/lib")

USERNAME = 'your_username'
PASSWORD = 'your_password'
HOST = 'subdomain.domain.tld'
PORT = 1521
SERVICE = 'your_oracle_service_name'

# 生成标准DSN
dsn = oracledb.makedsn(HOST, PORT, service_name=SERVICE)
engine = create_engine(f"oracle+cx_oracle://{USERNAME}:{PASSWORD}@{dsn}")

3. 配置环境变量

  • Linux/macOS:将Oracle客户端库路径加入对应环境变量:
    export LD_LIBRARY_PATH=/usr/lib/oracle/19/client64/lib:$LD_LIBRARY_PATH
    
  • Windows:把Instant Client解压路径添加到系统PATH,重启终端或IDE后生效。

4. 验证基础连接

跳过SqlAlchemy,直接用oracledb测试连接,确认数据库可访问:

import oracledb

oracledb.init_oracle_client(lib_dir="/path/to/oracle/client/lib")
connection = oracledb.connect(
    user="your_username",
    password="your_password",
    dsn="subdomain.domain.tld:1521/your_oracle_service_name"
)
print(connection.version)
connection.close()

此连接成功则问题在SqlAlchemy配置;失败则先排查网络、账号权限、服务名正确性等基础问题。

5. 确认SqlAlchemy版本兼容性

使用SqlAlchemy 1.4.40及以上版本,或2.x系列版本,确保支持oracledb作为cx_Oracle替代。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:43:16