pyodbc autocommit似乎不适用于sybase和sqlalchemy

时间:2015-11-14 21:50:05

标签: python sqlalchemy sybase-ase pyodbc

我使用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:sql' exec ....':(' ZZZZZ'," [ZZZZZ])执行失败   [SAP] [ASE ODBC驱动程序] [Adaptive Server Enterprise]存储过程   ' p_procedure'可能只在非链式事务模式下运行。 ' SET   链接'命令将导致当前会话使用unchained   交易模式。\ 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   驱动程序] [Adaptive Server Enterprise] ....

你能在这里看到什么问题吗?

一如既往,我们非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

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

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

connect_args - 将直接传递的选项字典   DBAPI的connect()方法作为附加的关键字参数。

答案 1 :(得分:0)

我在自动提交选项时遇到了一些问题。对我有用的唯一方法是在建立连接后将此选项更改为 True

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

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