web-dev-qa-db-fra.com

Pyodbc - "Le nom de la source de données est introuvable et aucun pilote par défaut spécifié"

J'ai du mal à faire fonctionner pyodbc. J'ai unixodbc, unixodbc-dev, odbc-postgresql, pyodbc paquets installés sur ma Linux Mint 14. Je perds l’espoir de trouver la solution par moi-même, toute aide appréciée. Voir les détails ci-dessous:

En cours d'exécution

>>> import pyodbc
>>> conn = pyodbc.connect("DRIVER={PostgreSQL};SERVER=localhost;DATABASE=test;USER=openerp;OPTION=3;")

me donne:

>>> pyodbc.Error: ('IM002', '[IM002] [unixODBC][Driver Manager]Data source name not found, and no default driver specified (0) (SQLDriverConnect)')

# odbcinst -j donne:

unixODBC 2.2.14
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /home/atman/.odbc.ini
SQLULEN Size.......: 4
SQLLEN Size........: 4
SQLSETPOSIROW Size.: 2

Ce qui me fait penser à un problème de configuration unixodbc. Voici le contenu de mon fichier unixodbc config:

Fichier/etc/odbcinst.ini:

[PostgreSQL ANSI]
Description     = PostgreSQL ODBC driver (ANSI version)
Driver      = psqlodbca.so
Setup       = libodbcpsqlS.so
Debug       = 0
CommLog     = 1
UsageCount      = 2

[PostgreSQL Unicode]
Description     = PostgreSQL ODBC driver (Unicode version)
Driver      = psqlodbcw.so
Setup       = libodbcpsqlS.so
Debug       = 0
CommLog     = 1
UsageCount      = 2

Fichier/etc/odbc.ini) :

[PostgreSQL test]
Description         = PostgreSQL 
Driver              = PostgreSQL ANSI
Trace               = No
TraceFile           = /tmp/psqlodbc.log
Database            = template1
Servername          = localhost
UserName            =
Password            =
Port                =
ReadOnly            = Yes
RowVersioning       = No
ShowSystemTables    = No
ShowOidColumn       = No
FakeOidIndex        = No
ConnSettings        =

Fichier~/.odbc.ini:

[DEFAULT]
Driver = PostgreSQL

[PostgreSQL]
Description         = Test to Postgres
Driver              = PostgreSQL
Trace               = Yes
TraceFile           = sql.log
Database            = nick
Servername          = localhost
UserName            =
Password            =
Port                = 5432
Protocol            = 6.4
ReadOnly            = No
RowVersioning       = No
ShowSystemTables    = No
ShowOidColumn       = No
FakeOidIndex        = No
ConnSettings        =
41
atman

Je pense que la réponse à votre problème est que, dans votre fichier ~/.odbc.ini, vous dites d'utiliser le pilote PostgreSQL - mais vous n'avez pas défini ce pilote dans votre fichier /etc/odbcinst.ini. Essayez de changer PostgreSQL en PostgreSQL ANSI ou PostgreSQL Unicode (définis dans /etc/odbcinst.ini).

24
Benny Hill

Pour moi, le problème était l'emplacement réel de mes fichiers odbc.ini et odbcinst.ini.

Sur de nombreux systèmes, l’emplacement d’installation de ces fichiers se trouve dans/etc /

Cependant, dans mon cas, ces fichiers se trouvaient sous/usr/local/etc /

Le pourrait être déterminé en tapant
odbcinst -j

Ce qui a donné:

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

Mes fichiers odbc.ini existent déjà dans/etc, la solution a donc été de les copier depuis/etc/vers/usr/local/etc /

cp /etc/odbc.ini /etc/odbcinst.ini /usr/local/etc/

Edit: Il est également intéressant de noter que le chemin fourni par la commande odbcinst -j peut changer en fonction de l'utilisation de Sudo ou non.

15
tandy

Pour moi, tout se résumait à un seul caractère d'espacement.

$cat /home/ec2-user/.odbc.ini
[DSNNAME]
Driver =FreeTDS
Description=description
Server =serverpath
Port =1433
Database =dbname

M'a donné l'erreur "Le nom de la source de données est introuvable et aucun pilote par défaut spécifié".

En supprimant tous les espaces avant le caractère '=', cela a fonctionné.

Sur une note secondaire, l'utilisation d'osql pour le test de connexion DSN vous donne une description beaucoup plus détaillée de toutes les erreurs. Cela m'a beaucoup aidé dans le processus.

$ 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

La comparaison du message d'erreur avec mon fichier ini a grandement facilité la résolution du problème.

4
Andy G

Pour les autres personnes qui résolvent cette même erreur générique, assurez-vous de ne pas ajouter accidentellement de caractères superflus en haut de votre fichier odbc.ini, ce qui l’invalide et rend toutes les déclarations de source de données silencieusement ignoré (l'erreur ne donne aucune indication sur le problème spécifique).

1
DavidJ

J'ai le même problème. Il s'avère que le fichier source de données a manqué: /etc/ODBCDataSources. Il suffit de toucher ce fichier et cela fonctionne.

1
yzark