我正在尝试使用 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/