使用FreeTDS的Pyodbc连接字符串的SqlAlchemy等效项

发布于 2021-01-29 17:54:10

以下作品:

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?

请注意: 我想保留此DSN-less。

关注者
0
被浏览
51
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    @Singletoned的示例不适用于SQLAlchemy 0.7.2。从用于连接到SQL
    Server
    SQLAlchemy文档中

    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.

    因此,为了使它起作用,我使用了:

    import urllib
    quoted = urllib.quote_plus('DRIVER={FreeTDS};Server=my.db.server;Database=mydb;UID=myuser;PWD=mypwd;TDS_Version=8.0;Port=1433;')
    sqlalchemy.create_engine('mssql+pyodbc:///?odbc_connect={}'.format(quoted))
    

    这也应适用于Sybase。

    注意:在python 3中,urllib模块已拆分为多个部分并重命名。因此,python 2.7中的这一行:

    quoted = urllib.quote_plus
    

    必须在python3中更改为这一行:

    quoted = urllib.parse.quote_plus
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看