我使用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] ....
一如既往,我们非常感谢任何帮助。
答案 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