Pyodbc - "Data source name not found, and no default driver specified"
For me, it was all down to a single whitespace character.
$cat /home/ec2-user/.odbc.ini
[DSNNAME]
Driver =FreeTDS
Description=description
Server =serverpath
Port =1433
Database =dbname
Gave me the “Data source name not found, and no default driver specified” error.
Removing all the whitespaces before the '=' character made it work.
On a secondary note, using osql for DSN connection testing gives you a much more verbose description of any errors. It helped me a lot in the process.
$ osql -S DSNNAME -U username -P password
checking shared odbc libraries linked to isql for default directories...
trying /txM ... no
trying /tmp/sql ... no
trying /tmp/sql ... no
trying /w}H ... no
trying /usr/loc ... no
trying /tmp/sql.log ... no
trying /home ... no
trying /.odbc.ini ... no
trying /usr/local/etc ... OK
checking odbc.ini files
reading /home/ec2-user/.odbc.ini
[DSNNAME] found in /home/ec2-user/.odbc.ini
found this section:
[DSNNAME]
Driver =FreeTDS
Description=description
Server =serverpath
Port =1433
Database =dbname
looking for driver for DSN [DSNNAME] in /home/ec2-user/.odbc.ini
no driver mentioned for [DSNNAME] in .odbc.ini
looking for driver for DSN [default] in /home/ec2-user/.odbc.ini
osql: error: no driver found for [DSNNAME] in .odbc.ini
Comparing the error message against my ini file made triaging the issue a lot easier.
For me, the issue was the actual location of my odbc.ini and odbcinst.ini files.
On many systems, the install location of these files is in /etc/
However, in my case, these files were located under /usr/local/etc/
The could be determined by typingodbcinst -j
Which yielded:
unixODBC 2.3.0
DRIVERS............: /usr/local/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
USER DATA SOURCES..: /usr/local/etc/odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
My odbc.ini files already exists in /etc, so the solution was to copy them over over from /etc/ to /usr/local/etc/
cp /etc/odbc.ini /etc/odbcinst.ini /usr/local/etc/
Edit: It's also worth noting that the path outputted by the odbcinst -j command can change depending on using sudo
or not.
I believe the answer to your problem is that in your ~/.odbc.ini file you are saying to use driver PostgreSQL
- but you have not defined that driver in your /etc/odbcinst.ini file. Try changing PostgreSQL
to PostgreSQL ANSI
or PostgreSQL Unicode
(both of which are defined in /etc/odbcinst.ini).