简体   繁体   中英

pyodbc connection to MS SQL Server running on a docker container

pyodbc doesn't seem to be able to connect when trying to connect through specifying Driver. I am able to connect to setting up a DSN but I also want to make connection when user has got the Driver, Server, UID, PWD and Database details.

I am on Mac and and using FreeTDS driver.

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

Here is how I am trying to connect:

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

The error I get is this:

pyodbc.OperationalError: ('08001', '[08001] [FreeTDS][SQL Server]Unable to connect to data source (0) (SQLDriverConnect)')

Exact same database details work when I try to connect through DSN.

If you have a freetds.conf file containing the host name/IP and port, eg,

gord@xubuntu64-nbk1:~$ cat /etc/freetds/freetds.conf 
[myFreeTdsHost]
    host = 192.168.0.179
    port = 49242

then you can use both of those values in your DSN-less connection string by simply specifying the SERVERNAME=

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

You can also supply the host name/IP and port directly via SERVER= and PORT= like so

# 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_;'
)

For details, see the FreeTDS documentation here .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM