SqlAlchemy 相当于使用 FreeTDS 的 pyodbc 连接字符串
以下有效:
import pyodbc
pyodbc.connect('DRIVER={FreeTDS};Server=my.db.server;Database=mydb;UID=myuser;PWD=mypwd;TDS_Version=8.0;Port=1433;')
以下失败:
import sqlalchemy
sqlalchemy.create_engine("mssql://myuser:[email protected]:1433/mydb?driver=FreeTDS& odbc_options='TDS_Version=8.0'").connect()
上面的错误消息是:
DBAPIError: (错误) ('08001', '[08001] [unixODBC][FreeTDS][SQL Server]无法连接到数据源 (0) (SQLDriverConnectW)') 无 无
有人能给我指出正确的方向吗?有没有一种方法可以简单地告诉 sqlalchemy 将特定的连接字符串传递给 pyodbc?
请注意:我想保留此 DSN。
The following works:
import pyodbc
pyodbc.connect('DRIVER={FreeTDS};Server=my.db.server;Database=mydb;UID=myuser;PWD=mypwd;TDS_Version=8.0;Port=1433;')
The following fails:
import sqlalchemy
sqlalchemy.create_engine("mssql://myuser:[email protected]:1433/mydb?driver=FreeTDS& odbc_options='TDS_Version=8.0'").connect()
The error message for above is:
DBAPIError: (Error) ('08001', '[08001] [unixODBC][FreeTDS][SQL Server]Unable to connect to data source (0) (SQLDriverConnectW)') None None
Can someone please point me in the right direction? Is there a way I can simply tell sqlalchemy to pass a specific connect string through to pyodbc?
Please Note: I want to keep this DSN-less.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
@Singletoned 的示例不适用于 SQLAlchemy 0.7.2。来自用于连接到 SQL Server 的 SQLAlchemy 文档:
如果您需要如果连接字符串超出上述选项,请使用 odbc_connect 关键字传入 urlencoded 连接字符串。传入的内容将被 url 解码并直接传递。
因此,为了使其工作,我使用了:
这也应该适用于 Sybase。
注意:在 python 3 中,urllib 模块已被拆分为多个部分并重命名。因此,python 2.7 中的这一行:
必须更改为 python3 中的这一行:
The example by @Singletoned would not work for me with SQLAlchemy 0.7.2. From the SQLAlchemy docs for connecting to SQL Server:
If you require a connection string that is outside the options presented above, use the odbc_connect keyword to pass in a urlencoded connection string. What gets passed in will be urldecoded and passed directly.
So to make it work I used:
This should apply to Sybase as well.
NOTE: In python 3 the urllib module has been split into parts and renamed. Thus, this line in python 2.7:
has to be changed to this line in python3:
我仍然对在 sqlalchemy
create_engine
语句中的一行中执行此操作的方法感兴趣,但我发现了以下解决方法 详细信息:更新:解决了我在自己的评论中提出的关于无法将参数传递给连接字符串。如果您需要在运行时动态连接到不同的数据库,以下是通用解决方案。我只将数据库名称作为参数传递,但可以根据需要轻松使用其他参数:
I'm still interested in a way to do this in one line within the sqlalchemy
create_engine
statement, but I found the following workaround detailed here:UPDATE: Addresses a concern I raised in my own comment about not being able to pass arguments to the connect string. The following is a general solution if you need to dynamically connect to different databases at runtime. I only pass the database name as a parameter, but additional parameters could easily be used as needed:
这是有效的:
在这种格式中,SQLAlchemy 只是忽略连接字符串并将其直接传递给 pyodbc。
更新:
抱歉,我忘记了 uri 必须进行 url 编码,因此,以下工作有效:
This works:
In that format, SQLAlchemy just ignores the connection string and passes it straight on to pyodbc.
Update:
Sorry, I forgot that the uri has to be url-encoded, therefore, the following works:
在内部,“my.db.server:1433”作为连接字符串的一部分传递,例如
SERVER=my.db.server:1433;
。不幸的是,unixODBC/FreeTDS 不接受 SERVER 位中的端口。相反,它需要
SERVER=my.db.server;PORT=1433;
要对连接字符串使用 sqlalchemy 语法,您必须将端口指定为参数。
变成:
Internally "my.db.server:1433" is passed as part of a connection string like
SERVER=my.db.server:1433;
.Unfortunately unixODBC/FreeTDS won't accept a port in the SERVER bit. Instead it wants
SERVER=my.db.server;PORT=1433;
To use the sqlalchemy syntax for a connection string, you must specify the port as a parameter.
becomes:
要将各种参数传递给连接函数,听起来格式字符串可能会执行您想要的操作:
然后您可以使用类似以下内容来调用它:
有关格式字符串的更多信息在这里: http://docs.python.org/library/string.html#formatstrings
To pass various parameters to your connect function, it sounds like format string might do what you want:
And you would then call it with something like:
More info on format strings is here: http://docs.python.org/library/string.html#formatstrings