SQLAlchemy+PyODBC连SQL Server遇SQLEndTran错误,求排查引擎配置问题
解决方案
1. 调整事务隔离级别为自动提交
SQLAlchemy默认会开启隐式事务,若你的数据库环境不支持这种处理逻辑,就会出现事务结束时找不到对应事务的错误。可以在创建引擎时指定自动提交模式:
import pandas as pd import sqlalchemy from sqlalchemy.engine import URL driver='ODBC Driver 17 for SQL Server' server='MyServer' database='MyDB' username = 'MyUser' password = 'MyPWD' connection_string = f'DRIVER={driver};SERVER={server};PORT=17001;DATABASE={database};UID={username};PWD={password}' engine = sqlalchemy.create_engine( URL.create("mssql+pyodbc", query={"odbc_connect": connection_string}), isolation_level="AUTOCOMMIT" ) pd.read_sql(sql=Query, con=engine)
2. 修正服务器地址的端口写法
SQL Server的ODBC连接字符串中,端口通常与服务器地址合并书写,格式为SERVER=服务器地址,端口,而非单独使用PORT参数。修改连接字符串后重试:
connection_string = f'DRIVER={driver};SERVER={server},17001;DATABASE={database};UID={username};PWD={password}' engine = sqlalchemy.create_engine(URL.create("mssql+pyodbc", query={"odbc_connect": connection_string}))
3. 直接使用SQLAlchemy原生URL格式创建引擎
跳过构造pyodbc连接字符串的步骤,直接用SQLAlchemy的URL规则生成引擎:
engine_url = f"mssql+pyodbc://{username}:{password}@{server}:17001/{database}?driver={driver.replace(' ', '+')}" engine = sqlalchemy.create_engine(engine_url)
注意需将驱动名称中的空格替换为+,符合URL编码要求。
4. 检查并升级依赖库版本
旧版本的SQLAlchemy或pyodbc可能存在事务处理的兼容性bug,尝试升级两个库:
pip install --upgrade sqlalchemy pyodbc
内容的提问来源于stack exchange,提问作者Yona
相关产品推荐
相关产品推荐

