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

标签 python sqlalchemy sap-ase pyodbc

我正在尝试使用 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 在端口规范上“作弊”,您将得到:

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

但这感觉像是一个坏主意™,即使它有效。我还注意到,生成的字符串使用 Database 作为键,而不是 Sybase 连接字符串引用中的 Db。这也可能被证明是一个问题。

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

关于python - Sqlalchemy pyodbc 无 DNS URL 连接字符串似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33714028/

相关文章:

python - 检索 youtube 订阅 python api

python - 如何防止 PyMySQL 转义标识符名称?

python - 通过 SQLAlchemy 查询时如何从 Python 过滤名称列表

python - 如何使用 Active Directory 集成身份验证通过 python SQL alchemy 连接到 Azure sql 数据库

sap-ase - 如何使用 DSN 或 RapidSQL 连接到没有端口号的 Sybase 服务器/数据库?或者如何找到端口号?

jdbc - 使用带有 JRuby 的 jTDS 驱动程序的 Sybase ASE 12.5.4

python - Pandas - 在连接/合并数据帧之前检查列

python - 动态数据透视表的有效方法

python - 如何将我的两个 @listens_for 事件回调重构为一个?

SQL为什么使用 'between'而不是 '>= and <='