使用SQLAlchemy连接OSIsoft PI数据库时遇SQL_AUTOCOMMIT_OFF未实现错误
解决OSIsoft PI数据库SQLAlchemy连接报错问题
问题根源
PI ODBC驱动不支持关闭自动提交(SQL_AUTOCOMMIT_OFF),而SQLAlchemy默认会尝试将连接的自动提交模式设为关闭,触发驱动报错。同时,之前使用mssql+pyodbc的dialect并不适配PI ODBC驱动,容易引发额外兼容性问题。
解决方案
直接使用SQLAlchemy的通用pyodbc连接方式,保留原始ODBC连接参数并强制开启自动提交:
步骤1:构造编码后的ODBC连接字符串
因为SQLAlchemy的URL格式要求特殊字符转义,需要先对原始ODBC连接字符串进行URL编码:
import urllib from sqlalchemy import create_engine # 替换为你的实际账号密码 uid = "your_username" pw = "your_password" DSN = "PIODBC" # 构造原始ODBC连接字符串 raw_odbc_str = f"DSN={DSN};UID={uid};PWD={pw}" # URL编码处理特殊字符 encoded_odbc_str = urllib.parse.quote_plus(raw_odbc_str)
步骤2:创建带自动提交的SQLAlchemy引擎
通过connect_args强制开启自动提交,适配PI驱动的限制:
# 创建SQLAlchemy引擎 engine = create_engine( f"pyodbc:///?odbc_connect={encoded_odbc_str}", connect_args={"autocommit": True} )
步骤3:使用引擎执行查询(兼容pandas)
直接将引擎传入pandas的read_sql_query,既消除警告又避免报错:
import pandas as pd qry = "SELECT * FROM your_pi_table" df = pd.read_sql_query(qry, engine)
或者直接执行原生SQL:
with engine.connect() as con: rs = con.execute(qry) results = rs.fetchall()
关键说明
- 避免使用
mssql+pyodbcdialect:PI ODBC并非SQL Server驱动,通用pyodbc://方式兼容性更好。 - 强制
autocommit=True:完全匹配原pyodbc连接的行为,适配PI驱动不支持事务的特性。
内容的提问来源于stack exchange,提问作者TheScottishKiwi
相关产品推荐
相关产品推荐

