在Docker容器上运行的MS SQL Server的pyodbc连接

3

当尝试通过指定驱动程序进行连接时,pyodbc似乎无法连接。我能够通过设置DSN进行连接,但是我也希望在用户拥有驱动程序、服务器、UID、PWD和数据库详细信息时建立连接。

我使用Mac并使用FreeTDS驱动程序。

freetds.conf

[MYMSSQL]
host = 0.0.0.0
port = 1433
tds version = 7.3

odbcinst.ini

[FreeTDS]
Description=FreeTDS Driver for Linux & MSSQL
Driver=/usr/local/lib/libtdsodbc.so
Setup=/usr/local/lib/libtdsodbc.so
UsageCount=10

这是我尝试连接的方法:

conn_str = "DRIVER=FreeTDS;SERVER={0};UID={1};PWD={2};DATABASE={3}".format('MYMSSQL', 'sa', 'password','tempdb')
conn = pyodbc.connect(conn_str)

我收到的错误信息是这样的:
pyodbc.OperationalError: ('08001', '[08001] [FreeTDS][SQL Server]Unable to connect to data source (0) (SQLDriverConnect)')

当我尝试通过DSN连接时,完全相同的数据库详细信息有效。


你在创建 DSN 时选择了 FreeTDS 驱动程序还是其他驱动程序? - ansu5555
在DSN配置中有“Driver”条目,因此我有[MS_SQL_SERVER_DSN] 描述=测试到SQLServer 驱动程序=FreeTDS 服务器名称=MYMSSQL 数据库=tempdb - Toseef Zafar
你可以尝试像这样提供驱动程序:DRIVER={FreeTDS},看看会发生什么。 - ansu5555
刚试了一下,但没有成功。 - Toseef Zafar
1
如果您想从freetds.conf中提取服务器名称,我认为您需要在连接字符串中使用SERVERNAME=(而不是SERVER=)。详情请参见此处 - Gord Thompson
@GordThompson 谢谢!那个方法可行!你知道是否有一种方法可以使用主机名而不是在freetds中配置的SERVERNAME吗? 如果您想将该评论作为答案,我会接受它。 - Toseef Zafar
1个回答

2
如果您有一个包含主机名/IP和端口的freetds.conf文件,例如:
gord@xubuntu64-nbk1:~$ cat /etc/freetds/freetds.conf 
[myFreeTdsHost]
    host = 192.168.0.179
    port = 49242

然后,您可以通过简单地指定 SERVERNAME= 来在 DSN-less 连接字符串中使用这两个值。

# get host name/IP and port from freetds.conf
cnxn_str = (
    'DRIVER=FreeTDS_ODBC;'
    'SERVERNAME=myFreeTdsHost;'
    'DATABASE=myDb;'
    'UID=sa;PWD=_whatever_;'
)

您也可以通过 SERVER=PORT= 直接提供主机名/IP和端口号,如下所示:

# supply host name/IP and port directly (bypassing freetds.conf)
cnxn_str = (
    'DRIVER=FreeTDS_ODBC;'
    'SERVER=192.168.0.179;'
    'PORT=49242;'
    'DATABASE=myDb;'
    'UID=sa;PWD=_whatever_;'
)

详细信息请参考FreeTDS文档此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接