Modin调用read_sql读Oracle遇连接警告及ORA-12170超时如何解决
Modin read_sql读取Oracle警告及连接超时解决方案
警告原因说明
Modin并行版read_sql的实现逻辑要求传入原生SQLAlchemy连接字符串,才能自主拆分查询任务、创建多连接实现并行数据拉取。如果传入已初始化的sqlalchemy.engine.Engine对象、cx_Oracle连接对象,Modin无法复用已有连接做并行处理,会退化为单线程Pandas实现,同时触发对应警告。
ORA-12170超时问题解决
超时是因为短格式的Oracle连接串在部分场景下无法被cx_Oracle/Modin正确解析,按以下步骤排查修复:
- 首先确认运行代码的设备与Oracle服务器1521端口网络连通,可执行命令
telnet 你的服务器地址 1521验证,端口不通优先检查防火墙、网络策略、服务器地址配置错误问题 - 替换短连接串为完整TNS格式的连接字符串,避免SID解析异常
- 确认环境已安装适配的依赖:cx_Oracle≥8.0、SQLAlchemy≥1.4、Modin≥0.18
正确代码示例
启用Modin并行读取(无警告)
直接传入完整格式的连接字符串即可触发并行实现,无警告:
import modin.pandas as pd # 构造完整TNS格式连接串,替换为你自己的账号、密码、服务器地址、SID conn_str = "oracle+cx_oracle://你的账号:你的密码@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST={})(PORT=1521))(CONNECT_DATA=(SID=你的SID)))".format(server) OraTbl = pd.read_sql(colqry, conn_str)
必须使用已创建Engine的场景(规避警告)
如果业务逻辑需要复用已创建的Engine对象,可以显式用原生Pandas读取后转Modin DataFrame,不会触发警告:
from sqlalchemy import create_engine import pandas as native_pd import modin.pandas as pd engine = create_engine("oracle+cx_oracle://你的账号:你的密码@服务器地址:1521/你的SID") # 原生Pandas读库,再转Modin对象 native_df = native_pd.read_sql(colqry, engine) OraTbl = pd.DataFrame(native_df)
内容的提问来源于stack exchange,提问作者user1082748
相关产品推荐
相关产品推荐

