Pyodbc - "Имя источника данных не найдено, а драйвер по умолчанию не указан"

У меня проблемы с работой pyodbc. У меня есть пакеты unixodbc, unixodbc-dev, odbc-postgresql, pyodbc, установленные на моем Linux Mint 14. Я теряю надежду найти решение самостоятельно, любая помощь оценивается. См. Подробности ниже:

Running:

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

Дает мне:

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

# odbcinst -j дает:

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

Что заставляет меня думать, что существует проблема конфигурации unixodbc. Вот мой конфигурационный файл unixodbc:

Файл /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

Файл /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        =

Файл ~/.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        =

Ответы

Ответ 1

Я считаю, что ответ на вашу проблему заключается в том, что в файле ~/.odbc.ini вы говорите, что используете драйвер PostgreSQL - но вы не указали этот драйвер в файле /etc/odbcinst.ini. Попробуйте изменить PostgreSQL на PostgreSQL ANSI или PostgreSQL Unicode (оба из них определены в/etc/odbcinst.ini).

Ответ 2

Для меня проблема была в фактическом расположении моих файлов odbc.ini и odbcinst.ini.

Во многих системах место установки этих файлов находится в /etc/

Однако в моем случае эти файлы находились в каталоге /usr/local/etc/

Можно определить, набрав odbcinst -j

Что дало:

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

Мои файлы odbc.ini уже существуют в /etc, поэтому решение было скопировать их из/etc/в/usr/local/etc/

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

Изменить: также стоит отметить, что путь, выданный командой odbcinst -j, может меняться в зависимости от использования sudo или нет.

Ответ 3

Для меня все было связано с одним символом пробела.

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

Дал мне "Имя источника данных не найдено, а драйвер по умолчанию не указан".

Удаление всех пробелов перед символом '=' заставило его работать.

На вторичной ноте, используя osql для тестирования соединения DSN, вы получите гораздо более подробное описание любых ошибок. Это очень помогло мне в этом процессе.

$ 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

Сравнение сообщения об ошибке с моим ini файлом упростило проблему.

Ответ 4

Для других, устраняющих эту же общую ошибку, убедитесь, что вы случайно не добавили лишних символов вверху вашего файла odbc.ini, что приводит к его недействительности, и все объявления с источниками данных будут молча игнорируется (ошибка не указывает на конкретную проблему).

Ответ 5

У меня та же проблема. Оказывается, файл источника данных пропустил: /etc/ODBCDataSources. Просто коснитесь этого файла, и он работает.