迁移Python脚本至新服务器后执行存储过程遇ObjectNotExecutableError
解决SQLAlchemy ObjectNotExecutableError报错
问题根源
新服务器上安装的SQLAlchemy是2.x版本,旧服务器用的是1.x版本。SQLAlchemy 2.0起,不能直接把字符串SQL传给con.execute(),必须用text()函数包装字符串,否则就会触发ObjectNotExecutableError。
修复方法
1. 导入text工具
如果已经通过import sqlalchemy as sa导入了SQLAlchemy,直接用sa.text即可;也可以单独导入:
from sqlalchemy import text
2. 修改执行语句
把原来的字符串SQL用text()包裹后再传入execute(),同时pandas.read_sql_query也建议统一用text()包装,避免版本兼容问题:
修改后的完整代码片段:
# imports from sqlalchemy import create_engine, text from sqlalchemy.engine import URL import pyodbc import pandas as pd import csv import configparser import sqlalchemy as sa import xlwings as xw import pysftp connection_string = "DRIVER={ODBC Driver 17 for SQL Server};SERVER=mainDB;DATABASE=Inventory;" connection_url = URL.create( "mssql+pyodbc", query={"odbc_connect": connection_string}) engine = sa.create_engine(connection_url) qry = "EXECUTE dbo.sp_GatherInventory" with engine.connect() as con: rs = con.execute(sa.text(qry)) # 用text包裹SQL字符串 df = pd.read_sql_query(sa.text(qry), engine) # pandas查询也统一用text包装
额外排查建议
- 核对新旧服务器的依赖版本:执行
pip list | findstr sqlalchemy(Windows)或pip list | grep sqlalchemy(Linux),确认SQLAlchemy版本差异 - 如果存储过程需要传参,别用字符串拼接,用
text()配合参数绑定语法,比如sa.text("EXECUTE dbo.sp_GatherInventory :param1").bindparams(param1=value)
内容的提问来源于stack exchange,提问作者SkyeBoniwell
相关产品推荐
相关产品推荐

