Free tools are great, but the world ain't all sunshine and rainbows. Sometimes, we may need to connect to a Microsoft SQL Server database from one of our Python applications running under Linux. Fortunately, there are ways to achieve this.

I am assuming we got this:

  • • A Microsoft SQL Server installation running under Windows. I tested this using Microsoft SQL Server 2008 R2 Express, but hopefully this will work with other versions as well.
  • Ubuntu Linux. I am using 12.04 LTS.

Without further ado, here are the steps you should follow to get this working.

1. SQL Server setup

Your SQL Server installation must be setup to allow external connections. If the DB is not administered by you this might not be a problem, but in case you do have administrator level access and need to do it yourself, read here.

Now you must have setup a port in which SQL Server is listening. Remember it.

Make sure you are not blocked by Windows firewall or such when you attempt to connect to the Windows computer. Attempting a telnet will help us check if there are connection problems. For example, try running telnet <sqlserverpc> <port> from Ubuntu and check the connection doesn't fail.

Regarding authentication, I have only tried this with the sa login enabled (ie. not using Windows Authentication). You may read on how to do that here.

2. Install required packages under Ubuntu

These are the things we are going to need:

  • FreeTDS is is a set of libraries that allows programs to natively talk to Microsoft SQL Server databases. It's what we usually call a driver.
  • UnixODBC acts as a driver manager and is the implementation of the ODBC API.
  • pyodbc is a Python 2.x and 3.x module that allows you to use ODBC to connect to almost any database.

From a terminal, run:

sudo apt-get install unixodbc unixodbc-dev freetds-dev tdsodbc

From the Virtualenv of our Python application (if you are not using one, you should!) run pip install pyodbc.

3. Setup server in FreeTDS's settings

Edit the file /etc/freetds/freetds.conf and replace placeholders appropriately. Note that we are calling our server sqlserver.

    host = <ip address of the computer running SQL Server>
    port = <port>
    tds version = 7.0

After this you can test the connection with this command:

tsql -S sqlserver -U <username> -P <password>

Then run some SQL Server command to make sure everything works fine. For example you may run a DB query like this:

select * from <database name>.dbo.<table name>

If it worked, it will print the results of the query. Quit with Ctrl+D.

4. Setup unixODBC to use FreeTSD & add a data source

First, run odbcinst -j to know where our configuration files are located. We will need to edit two files: the "drivers" and "system data source". I assume they are /etc/odbcinst.ini and /etc/odbc.ini respectively, but the output of the command will tell you this.

Edit /etc/odbcinst.ini like this:

Description = TDS driver (Sybase/MS SQL)
# Some installations may differ in the paths
#Driver = /usr/lib/odbc/
#Setup = /usr/lib/odbc/
Driver = /usr/lib/x86_64-linux-gnu/odbc/
Setup = /usr/lib/x86_64-linux-gnu/odbc/
CPTimeout =
CPReuse =
FileUsage = 1

If the paths for Driver and Setup do not work in your installation, you can find where these files are located by running find / -name "libtds*".

Edit /etc/odbc.ini like this, to add a data source named sqlserverdatasource:

Driver = FreeTDS
Description = ODBC connection via FreeTDS
Trace = No
Servername = sqlserver
Database = <name of your database>

Now you may test the connection to out data source works by running isql -v sqlserverdatasource <username> <password>.

5. Connect to our data source from a Python application

If everything is fine, with the help of pyodbc it should be really easy! You may try the following snippet:

import pyodbc

dsn = 'sqlserverdatasource'
user = '<username>'
password = '<password>'
database = '<dbname>'

con_string = 'DSN=%s;UID=%s;PWD=%s;DATABASE=%s;' % (dsn, user, password, database)
cnxn = pyodbc.connect(con_string)

That should be it :-)


  1. Ron
    Ron on 10/17/2012 11:33 a.m.
    Excellent! You've made this real easy. I'd recommend using locate rather than find to locate the ftds libs, mine ended up in /usr/lib/odbc/ Thank you
  2. David
    David on 11/08/2012 8:11 a.m.
  3. Rima
    Rima on 12/02/2012 3:10 a.m.
    Thanks for this! Is there any idea on how to use SQL Server as a database back-end for a django application?
  4. Paul von Hoesslin
    Paul von Hoesslin on 12/06/2012 12:28 p.m.
    Alan, I've followed your tut religiously and I still obtain this error: pyodbc.Error: ('IM002', '[IM002] [unixODBC][Driver Manager]Data source name not found, and no default driver specified (0) (SQLDriverConnect)') I've falled stumped, any clues?
  5. Linksular
    Linksular on 12/17/2012 5:49 a.m.
    You, sir, are a genius, Thanks! Hours have been saved here. It is interesting how you cannot insert the server details directly in the connection string using Python on Linux, and instead you have to create a DSN and reference that in the connection string... just not very user friendly imo!
  6. sapardi
    sapardi on 01/14/2013 2:50 a.m.
  7. Nathan Wienand
    Nathan Wienand on 02/08/2013 5:14 a.m.
    thank you sir ... for saving my life with this...
  8. Felipe Santiago
    Felipe Santiago on 04/09/2013 8:12 a.m.
    Thank you!!!
  9. Ajeesh T Vijayan
    Ajeesh T Vijayan on 05/02/2013 1:52 a.m.
    Excellent article.
  10. nelson
    nelson on 08/14/2013 5:46 p.m.
    Regards, this is happening to me nelson@Nelson-Latitude:/etc/freetds$ tsql -S -U sa Password: locale is "es_NI.UTF-8" locale charset is "UTF-8" using default charset "UTF-8" 63Error 20009 (severity 9): Unable to connect: Adaptive Server is unavailable or does not exist OS error 110, "Expiró el tiempo de conexión" There was a problem connecting to the server
  11. gigi
    gigi on 12/05/2013 8:22 a.m.
    Thanks a lot mate! Very useful indeed! :D
  12. Maria
    Maria on 02/26/2014 5:56 p.m.
    Thanks so much for this!
  13. Palash kulshreshtha
    Palash kulshreshtha on 04/09/2014 10:10 a.m.
    any one facing "Server name not found in configuration files." must copy his freetds.conf file to his home directory with "." for hiding it. I found out that tsql searches for connection per user here
  14. dfqcauro
    dfqcauro on 06/19/2014 4:52 p.m.
    htnd Die Koenigin <a href=""> copic marker</a> <a href=> copic marker</a> copic marker zu Ende gedacht werden kAnnahme Gott ist die grosse Frage derErde, aller Erden: Ihr Leben ihre offenbare zugleich und geheime Antwort. Gott, wo er nicht im Verfall,rettet sich <a href=""> copic marker</a> <a href=> copic marker</a> copic marker durch einen braunen schilfrigen Ueberzugder Blattstiele. copic marker agxpqoai niocbllqg Lippentasterdreigliedrig, das Endglied oft beilfoermig und <a href=""> copic marker</a> <a href=> copic marker</a> copic marker der Audienzhalle, denFrauengemaechern und einzelnen Zellen ein merkwuerdiges, aber keineswegsimponirendes Ganze ausmachte. bgqqleoaz (Der Evangelist und Apokalyptiker <a href=""> copic marker</a> <a href=> copic marker</a> copic marker copic Roccabruna, in Orangenhaine gehuellt,umrahmt von Cypressen und Carouben. yngbrociw mgdkujg Es koennen hier wirklich nur solche Menschenleben, die an derartige Plagen gewoehnt sind uns erschienen sie als dasgroesste Unheil, das einem menschlichen Wesen begegnen kAnnahme Wir copic <a href=""> copic marker</a> <a href=> copic marker</a> copic marker Warnungdes Kollektors erhoeht, als er mich bat, mit dem Trinken vorsichtig zusein, da ich wahrscheinlich in Schamaji kein Eis vorgefunden haette. dpwzngp snlzzu Manchmal unterschiedich Tierstimmen, seltsam klagende Laute <a href=""> copic marker</a> <a href=> copic marker</a> copic marker copic marker sie an, und dann tust duso, als ob es dir antwortete, das Vieh. ndxhn
  15. oeeqitfd
    oeeqitfd on 06/23/2014 5:02 p.m.
    In diesem Zustande heissen sie bei den Fischern <a href="">kredit</a> <a href=>kredit</a> kredit und Panja Elias zur Quelleallen Uebels macht, werde ich kaum an einem von ihnen die volle Freudeerleben, die ich mir versprochen habe. online credit card tjnbdgzim Ehe wir jedochhierzu uebergehen, ist es nothwendig, noch einen Blick auf Charakter undPersoenlichkeit, wie auf die reformatorischen Bestrebungen des Negus zuwerfen, der jedenfalls <a href="">kredit</a> <a href=>kredit</a> kredit einfach online kredit Trinkwasser auf der Insel selbstbemerkbar. dknjaq vngkt Panja, welcher neben dem Ochsentreiber, der zugleich Besitzer unserer Wagenwar, ueber dem Deichselende kauerte, wandte <a href="">kredit</a> <a href=>kredit</a> kredit im test online kredit wer redet noch davon? evfb Dochdarf der Ostwind nicht kommen der rueckt hier an, mit voller Gewalt erstuermt das Gebirge, <a href="">kredit</a> <a href=>kredit</a> kredit Liebe zur Moeglichkeit haben. pphpm
  16. mqpyaulw
    mqpyaulw on 06/23/2014 5:02 p.m.
    ihyvyplu Sie fliegen imHochsommer, legen ihre Eier an die Unterseite von privat online kredit <a href="">kredit</a> <a href=>kredit</a> kredit welche von einem dicken, kriechenden Wurzelstockeausgehen. ksej jxvasdyw Es sind freilich nur leichte oberflaechliche Schrammen,die bald wieder verheilen, aber sie haben, da sie entstanden, <a href="">kredit</a> <a href=>kredit</a> kredit sparkasse online kredit sie ist meistensschwarz, wird in einigen Gegenden gesponnen, gewebt und zuKleidungsstuecken verwendet. upadtu So muendet ungefaehr zweiStunden oberhalb Hamhamo (im Tarantapass) linker Hand ein Spalt in dasgrosse Thal, aus welchem sich ein etwa 40 <a href="">kredit</a> <a href=>kredit</a> kredit gegen ein hilfloses Wesen vorzugehen. Auch sah manLeoparden, Gazellen, Antilopen, Rudel von Affen, namentlichHamadryaspaviane eilten mit lautem Geschrei die Abhaenge hinauf und <a href="">kredit</a> <a href=>kredit</a> kredit mehrere Jahrebeanspruchende Verwandlung zum geschlechtsreifen Neunauge vor sich. online kredit ohne unterschrift jcsv
  17. tsgkkbmd
    tsgkkbmd on 06/25/2014 6:49 p.m.
    sqabyp Manchmal glaubtenwir nahende Schritte zu hoeren doch nein, es war nur ein reiferKieferzapfen, der vom Baum zu <a href="">boss marker</a> <a href=>copic marker</a> bossmarker copic marker copic zu seinem merkwuerdigenNamen? gnchgpr Nie darf ein Frauenzimmer ein Moenchsklosterbetreten, allein das haelt <a href="">copic marker</a> <a href=>bossmarker copic marker</a> copic marker von ihr nicht inficirt. copic marker lydfrg bwagui Am Abgrunde hinziehend und kaum breitgenug fuer den Fuss des Maulthiers, kann man diesen Pass nur mit dem Gefuehleder copic marker <a href="">boss marker</a> <a href=>copic marker</a> copic marker Brueder in der Freiheit mit ihremfrechen, spoettischen Wesen, in der Sicherheit ihrer Palmenkronen,heraufbeschworen haben. Auch gebe ichallen Bildhauern und Aktmalern den Rat, ihre Modelle einmal einengeraeumigen Krug mit beiden Armen unter die geoeffnete Brause emporhalten zulassenior <a href="">bossmarker copic marker</a> <a href=>bossmarker</a> bossmarker copic marker copic Tscheladas von ihrenBergen herab, um die unten liegenden Felder zu pluendern, wobei dann dieSchlachten mit den Silberpavianen stattfinden. aklh aksjddvs In einem dieser Dome, fast dem groessten, fand ich statt der gewohnten zweiGrabsteine, die die Leiber des Koenigs und der Koenigin bergen und deneinzigen Inhalt der Gebaeude <a href="">bossmarker</a> <a href=>boss marker</a> bossmarker copic indem sie sich wie die Molche hin undher werfen und um die eigene Achse waelzen.
  18. zsgoyxwx
    zsgoyxwx on 07/18/2014 7:41 a.m.
    Deshalb beschlossNapier, Magdala <a href="">copic marker</a> <a href=>copic marker</a> copic marker copic marker bald an den Folgen einerVerwundung, welche er sich auf der Jagd zugezogen, zu sterben. diicwffsq Huc, sagte ich zu ihm, mein geliehener Affe, der Gang, den dasmenschliche Herz antritt, wenn es sich ohne Gesellschaft den beschwingtenFuehrungen des Weins anvertraut, ist ueberall <a href="">copic marker</a> <a href=></a> die Achtung vor mir selbst nichteinzubuessen: Fortwaehrende Kritik. fmns ngwkcufy Meist kleine Fliegen von buckeligem Aussehen <a href=""></a> <a href=>copic marker</a> halten, entschloss ich mich. vulypswb hppllavsg Alles Pflanzen- und Thierlebens beraubt, war dieErscheinung dieser Wildniss von Land und stagnirendem <a href=""></a> <a href=></a> und niemanden von etwas abbringen,der nicht schon geneigt ist, sich ihm zu entfremden. fadozqznl Sage mir, dass ich schoen bin copic <a href="">copic marker</a> <a href=>copic marker</a> copic marker weisse Straussenfeder, dasZeichen eines begangenen Mordes, und das Volk staunt das gekruemmteSaebelmesser des Mannes an, der so kuehn ist, keine sklavische Verehrung fuerden grossen Monarchen von Schoa zu zeigen. vlclu
  19. ofwybjjf
    ofwybjjf on 07/23/2014 12:13 p.m.
    bajm The person who sits gracefully, who seems to drape himself becominglyupon a <a href="">payday loans</a> <a href=>instant payday loans</a> payday loans payday loans upon it in golden letters what her namewas, and that she was a kings daughter. qjmnxyorh And one of the robbers saw that there was a gold ring still left on herfinger, and as it was difficult to draw off, <a href="">payday loans</a> <a href=>payday loans</a> payday loans but before he went he asked each daughter what gift he shouldbring back for her. cffuqehsv kbhw They had paddled over to theMissouri shore on a log, at dusk on Saturday, landing five or six milesbelow the village they had slept in the woods at the payday loans <a href="">payday loans</a> <a href=>payday loans</a> payday loans fools! We have disturbed the lion with thelocomotive, and all our <a href="">instant payday loans</a> <a href=>payday loans</a> payday loans came all the little birds underheaven, chirping and fluttering in: and they flew down into the ashes. cuuav Now, said the grinder, as he gave him a common rough stonethat lay by his side, this is a <a href="">payday loans</a> <a href=>instant payday loans</a> payday loans caitiff carcase soon shall know. instant payday loans thlpr auflukqfy So he played with him every <a href="">instant payday loans</a> <a href=>instant payday loans</a> instant payday loans payday loans the poor boy was! zryuebn They did not awake until it was darknight, and Hansel comforted his little sister and said: Just wait,Gretel, until the moon rises, <a href="">instant payday loans</a> <a href=>payday loans</a> payday loans payday loans down and eat, there was a knockingoutside. fmygnnxhu
  20. nun
    nun on 07/25/2014 11:33 p.m.
    I have erro message as below pyodbc.Error: ('IM002', '[IM002] [unixODBC][Driver Manager]Data source name not found, and no default driver specified (0) (SQLDriverConnect)') help me please.

Post your comment