pyodbc autocommit 似乎不适用于 sybase 和 sqlalchemy

pyodbc autocommit does not appear to work with sybase and sqlalchemy

我正在使用 pyodbc 从 Python 3.4 连接到 sybase ASE 15 数据库并执行存储过程。

如果我使用本机 pyodbc,一切都按预期工作:

import pd
import pyodbc

con = pyodbc.connect('DSN=dsn_name;UID=username;PWD=password', autocommit=True)
df = pd.read_sql("exec p_procecure @GroupName='GROUP'", con)

[驱动程序是 Adaptive Server Enterprise]。

我必须 autocommit=True 如果我不这样做,我会收到以下错误:

DatabaseError: Execution failed on sql 'exec ....': ('ZZZZZ', "[ZZZZZ] [SAP][ASE ODBC Driver][Adaptive Server Enterprise]Stored procedure 'p_procedure' may be run only in unchained transaction mode. The 'SET CHAINED OFF' command will cause the current session to use unchained transaction mode.\n (7713) (SQLExecDirectW)")

我尝试使用 SQLAlchemy (1.0.9) 实现相同的目的:

from sqlalchemy import create_engine, engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.sql import text

url = r'sybase+pyodbc://username:password@dsn'
engine = create_engine(url, echo=True)
sess = sessionmaker(bind=engine).Session()

df = pd.read_sql(text("exec p_procedure @GroupName='GROUP'"),conn.execution_options(autocommit=True))

尽管我在连接上指定了 autocommit=True,但错误消息是相同的。 (我也在会话级别对此进行了测试,但应该没有必要并且没有任何区别)。

DBAPIError: (pyodbc.Error) ('ZZZZZ', "[ZZZZZ] [SAP][ASE ODBC Driver][Adaptive Server Enterprise]....

你能看出这里有什么问题吗?

一如既往,我们将不胜感激。

将 autocommit=True 参数作为 connect_args 参数字典中的一个项目传递确实有效:

connect_args = {'autocommit': True}
create_engine(url, connect_args=connect_args)

connect_args – a dictionary of options which will be passed directly to the DBAPI’s connect() method as additional keyword arguments.

我在使用 autocommit 选项时遇到了一些问题。唯一对我有用的是在建立连接后将此选项更改为 True

ConnString = 'Driver=%SQL_DRIVER%;Server=%SQL_SERVER%;Uid=%SQL_LOGIN%;Pwd=%SQL_PASSWORD%;'

SQL_CONNECTION = pyodbc.connect(ConnString)
SQL_CONNECTION.autocommit = True