2013-04-29 3 views
33

У меня проблемы с получением pyodbc работы. У меня есть unixodbc, unixodbc-dev, odbc-postgresql, pyodbc пакетах, установленных на моем Монетном дворе Linux 14. Я теряю надежду найти решение самостоятельно, любая помощь оценена. Смотрите подробности ниже:Pyodbc - «Имя источника данных не найдено, и указанный драйвер по умолчанию не указан»

Продолжительность:

>>> 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  = 
+0

Вы пытались: ... вам, возможно, придется скопировать /usr/local/etc/odbc.ini из /etc/odbc.ini и /usr/local/etc/odbcinst.ini из /etc/odbcinst.ini (по крайней мере, это был мой опыт, возможно, потому, что unixODBC уже был установлен с моим дистрибутивом linux) –

ответ

21

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

+0

Не могли бы вы набрать здесь пример? Должен ли я буквально заменить «PostgreSQL» на «PostgreSQL Unicode» или заменить на «psqlodbcw.so»? – atman

+0

Попробуйте буквально заменить 'PostgreSQL'' PostgreSQL Unicode' или 'PostgreSQL ANSI'. –

+1

Пробовал это, а также добавил полные пути к файлам драйверов в файле /etc/odbcinst.ini и без эффекта, все равно ... – atman

10

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

На многих системах, устанавливать расположение этих файлов в/и т.д./

Однако, в моем случае, эти файлы были расположены в/USR/местные/и т.д./

может быть определена набрав
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 подает lready существует в/и т.д., поэтому решение было скопировать их на более из/и т.д./в/USR/местные/и т.д./

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

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

+0

Спасибо за это, но у меня есть вопрос. Это исправление работает для меня, хотя я использовал os.environ ["ODBCINI"] = "/ etc/odbc.ini" os.environ ["ODBCSYSINI"] = "/ etc/odbcinst.ini" в моем коде , Кажется, что-то, так как/etc/ принадлежали root (так как это было показано при запуске '** sudo ** odbcinst -j'), файлы игнорировались программой (не выполнялись как root). Это кажется мне странным, так как файлы odbc имеют открытый доступ для чтения. Знаете ли вы, что с этим происходит? – lampShadesDrifter

4

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

$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-файлом упростило проблему.

1

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

1

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