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

使用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+pyodbc dialect:PI ODBC并非SQL Server驱动,通用pyodbc://方式兼容性更好。
  • 强制autocommit=True:完全匹配原pyodbc连接的行为,适配PI驱动不支持事务的特性。

内容的提问来源于stack exchange,提问作者TheScottishKiwi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 12:45:33