Sqlalchemy pyodbc DNS-less URL 连接字符串似乎不起作用

Sqlalchemy pyodbc DNS-less URL connection string does not seem to work

我正在尝试使用 sqlalchemy (1.0.9) 和 pyodbc 连接到 windows 上的 Sybase ASE 15 数据库。如果我使用 DNS url 一切正常:

url = r'sybase+pyodbc://usename:password@dns'
engine = create_engine(url, echo=True)
Session = sessionmaker(bind=engine)
sess = Session()
conn = sess.connection()

但是,如果我避开 DNS,我会收到一条错误消息:

url = 'sybase+pyodbc://username:password@host:port/database?driver=Adaptive Server Enterprise'

,我得到一个错误:

DBAPIError: (pyodbc.Error) ('01S00', '[01S00] [SAP][ASE ODBC Driver]Invalid port number (30011) (SQLDriverConnect)')

端口号正确,与DNS中指定的端口相同。

有什么想法吗?

可能值得尝试使用 pyODBC(和一般的 ODBC)使用的分号分隔的无 DSN 格式的某些版本。这里有一些例子:

http://www.connectionstrings.com/adaptive-server-enterprise-odbc-driver/

这个问题解决了与 FreeTDS 类似的问题,但概念是相同的,因为连接字符串基本上传递到低级 ODBC 连接:

SqlAlchemy equivalent of pyodbc connect string using FreeTDS

URL 被 pyodbc 解析为这种类型的字符串,最终连接到 SQLDriverConnect(在 ODBC API 中),因此直接指定 ASE ODBC DSN-less 连接字符串可能会更好。

更新: 运行 快速测试以查看为此生成的连接参数 URL:

from sqlalchemy.engine.url import *
from sqlalchemy.connectors.pyodbc import *

connector =  PyODBCConnector()
url = make_url("sybase+pyodbc://username:password@host:5555/database?driver=Adaptive Server Enterprise")
print connector.create_connect_args(url)

这导致:

[['DRIVER={Adaptive Server Enterprise};Server=host,5555;Database=database;UID=username;PWD=password'], {}]

请注意,根据 http://www.connectionstrings.com/adaptive-server-enterprise-odbc-driver/tds-based-odbc-driver-from-sybase-ocs-125/,主机名和端口用逗号分隔,此格式适用于 Sybase 12.5 的基于 TDS 的 ODBC:

Driver={Sybase ASE ODBC Driver};NetworkAddress=myServerAddress,5000;
Db=myDataBase;Uid=myUsername;Pwd=myPassword;

但是,ASE 15 格式 (http://www.connectionstrings.com/adaptive-server-enterprise-odbc-driver/adaptive-server-enterprise-150/) 指定 server=myServerAddress;port=myPortnumber,其中 port 作为在分号分隔字符串中传递的键:

Driver={Adaptive Server Enterprise};app=myAppName;server=myServerAddress;
port=myPortnumber;db=myDataBase;uid=myUsername;pwd=myPassword;

如果您使用 host;port=5555 在端口规范上 "cheat",您将得到:

[['DRIVER={Adaptive Server Enterprise};Server=host;port=5555;Database=database;UID=username;PWD=password'], {}]

但这感觉就像一个 Bad Idea™,即使它可行。我还注意到生成的字符串使用 Database 作为键,而 Sybase 连接字符串参考中使用 Db。这也可能被证明是一个问题。

在链接问题中使用 ?odbc_connect 可能是控制发送到 ODBC 的确切连接参数的最佳选择。