Pyodbc - “未找到数据源名称,并且未指定默认驱动程序”

时间:2013-04-29 13:47:14

标签: postgresql python-2.7 pyodbc unixodbc

我无法让pyodbc工作。我在Linux Mint 14上安装了unixodbcunixodbc-devodbc-postgresqlpyodbc个软件包。 我正在失去希望自己找到解决方案,任何帮助表示赞赏。请参阅以下详细信息:

运行:

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

6 个答案:

答案 0 :(得分:24)

我相信你的问题的答案是在你的〜/ .odbc.ini文件中你要使用驱动程序PostgreSQL - 但是你没有在/etc/odbcinst.ini文件中定义该驱动程序。尝试将PostgreSQL更改为PostgreSQL ANSIPostgreSQL Unicode(两者都在/etc/odbcinst.ini中定义)。

答案 1 :(得分:13)

对我来说,问题是我的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而改变。

答案 2 :(得分: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文件进行比较,使得对问题的分类变得更加容易。

答案 3 :(得分:1)

对于其他对此相同的一般性错误进行疑难解答,请确保您没有在odbc.ini文件的顶部意外添加无关字符 - 这会导致其无效并且所有数据源声明都默默地忽略(错误没有说明具体问题)。

答案 4 :(得分:1)

我有同样的问题。事实证明,错过了数据源文件:/etc/ODBCDataSources。只需触摸该文件即可。

答案 5 :(得分:0)

对我来说,我发现这个问题是由于混合了 32 位和 64 位二进制文​​件。关于修复,我只能说“祝你好运,尽量保持 32 位或 64 位”。 ?