以下作品:
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:mypwd@my.db.server:1433/mydb?driver=FreeTDS& odbc_options='TDS_Version=8.0'").connect()
上面的错误消息是:
DBAPIError :(错误)('08001','[08001] [unixODBC] [FreeTDS] [SQL Server]无法连接到数据源(0)(SQLDriverConnectW)')无无
有人可以指点我正确的方向吗?有没有办法告诉sqlalchemy将特定的连接字符串传递给pyodbc?
Please Note: 我想保持这个DSN-less .
5 回答
@Singletoned的例子不适用于SQLAlchemy 0.7.2 . 来自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.
为了使它工作,我使用:
这也适用于Sybase .
注意:在python 3中,urllib模块已拆分为多个部分并重命名 . 因此,这行在python 2.7中:
必须在python3中更改为此行:
我仍然对在sqlalchemy
create_engine
语句中的一行中执行此操作感兴趣,但我发现以下解决方法detailed here:UPDATE :解决了我在自己的评论中提出的关于无法将参数传递给连接字符串的问题 . 如果需要在运行时动态连接到不同的数据库,以下是一般解决方案 . 我只将数据库名称作为参数传递,但可以根据需要轻松使用其他参数:
这有效:
在该格式中,SQLAlchemy只是忽略连接字符串并将其直接传递给pyodbc .
更新:
对不起,我忘记了uri必须是url编码的,因此,以下工作:
内部"my.db.server:1433"作为连接字符串的一部分传递,如
SERVER=my.db.server:1433;
.不幸的是,unixODBC / FreeTDS不接受SERVER位中的端口 . 相反,它想
SERVER=my.db.server;PORT=1433;
要将sqlalchemy语法用于连接字符串,必须将端口指定为参数 .
变为:
要将各种参数传递给connect函数,听起来像格式字符串可能会做你想要的:
然后你会用以下的东西来称呼它:
有关格式字符串的更多信息,请访问:http://docs.python.org/library/string.html#formatstrings