Search code examples
pythonsql-serversqlalchemypyodbcfreetds

SqlAlchemy equivalent of pyodbc connect string using FreeTDS


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:mypwd@my.db.server: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.


Solution

  • 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:

    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))
    

    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:

    quoted = urllib.quote_plus
    

    has to be changed to this line in python3:

    quoted = urllib.parse.quote_plus