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 的确切连接参数的最佳选择。
我正在尝试使用 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 的确切连接参数的最佳选择。