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

迁移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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 08:57:19