如何为create_engine()创建的SQLAlchemy实例设置Oracle会话module名称
解决方案
可以通过SQLAlchemy的连接事件监听机制实现,这是官方推荐的对原生DBAPI连接做自定义配置的方式,具体实现步骤如下:
- 第一步:导入所需依赖
from sqlalchemy import create_engine, event
- 第二步:创建引擎并注册连接监听事件
engine = create_engine(url="oracle+cx_oracle://user:xxxx@tns") # 监听连接池创建新连接的事件,每次新连接生成时自动设置module @event.listens_for(engine, "connect") def set_oracle_session_module(dbapi_connection, connection_record): # 此处的dbapi_connection就是原生的cx_Oracle连接对象 dbapi_connection.module = "MyModule" # 可选:还可以同步设置其他v$session可见属性,比如action、client_info等 # dbapi_connection.action = "MyAction" # dbapi_connection.clientinfo = "MyClientInfo"
可选方案:自定义连接创建函数
如果你需要完全控制连接的创建逻辑,也可以通过creator参数传入自定义的连接生成函数:
import cx_Oracle from sqlalchemy import create_engine def custom_cx_oracle_conn(): conn = cx_Oracle.connect(user="user", password="xxxx", dsn="tns") conn.module = "MyModule" return conn # 传入creator参数,引擎会调用该函数获取原生连接 engine = create_engine("oracle+cx_oracle://", creator=custom_cx_oracle_conn)
验证方式
配置完成后,可以通过如下SQL查询当前会话的module属性,验证配置是否生效:
SELECT module FROM v$session WHERE sid = SYS_CONTEXT('USERENV', 'SID')
说明
- 该配置对所有从该Engine连接池获取的新连接自动生效,无需每次手动调整连接属性
- 适配SQLAlchemy 1.x和2.x全版本
内容的提问来源于stack exchange,提问作者mxdev88
相关产品推荐
相关产品推荐

