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

问题描述 投票:0回答:7

我很难找到

pyodbc
工作。我在 Linux Mint 14 上安装了
unixodbc
unixodbc-dev
odbc-postgresql
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        =
python postgresql python-2.7 pyodbc unixodbc
7个回答
25
投票

我相信您问题的答案是在您的 ~/.odbc.ini 文件中您说要使用驱动程序

PostgreSQL
- 但您尚未在 /etc/odbcinst.ini 文件中定义该驱动程序。尝试将
PostgreSQL
更改为
PostgreSQL ANSI
PostgreSQL Unicode
(两者均在 /etc/odbcinst.ini 中定义)。


19
投票

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


5
投票

对我来说,这一切都取决于一个空白字符。

$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

。只需触摸该文件即可运行。

    


1
投票
that

,我只能说“祝你好运,并尝试将其全部保留为 32 或全部 64。” 😓 解释,因为有人要求:

基本上,我们将应用程序与我们使用的 32 位二进制文件捆绑在一起。我们无法获得该专有二进制文件的 64 位版本(我们在获得 ofc 许可的情况下使用和分发它)。二进制文件是一个

.dll

文件。

如果 64 位二进制文件(例如 

.exe

)导入

.dll
,它会假设可运行代码和其他资产(例如字符串)在该二进制文件中的位置。当 64 位导入 32 位时,并且 64 位尚未正确配置,它将假定错误的位置,因为指令占用了不同的空间量,因此文件中的位数也不同。
如果 32 位二进制文件与 64 位共享任何内存(确实如此),也可能会出现问题,因为即使像 

numbers

这样的基本类型在两者之间的大小(以位为单位)也可能有所不同。 我会更详细地了解我的具体场景,但它是闭源软件,我不再在团队中了,而且它似乎有点商业秘密。


0
投票

我的连接字符串:

cnxn_str = ("Driver={SQL Server xxx};" "Server=xx.xxx.xx.xx;" "Database=xxxxxx;" "UID=yyyyyy;" "PWD=yyyyy;")

遇到错误:pyodbc.InterfaceError:('IM002','[IM002] [unixODBC][驱动程序管理器]未找到数据源名称,并且未指定默认驱动程序(0)(SQLDriverConnect)')

这是我修复它的方法:

安装了curl、unixODBC、unixODBC-devel 和msodbc:

yum install -y curl unixODBC unixODBC-devel curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/mssql-release.repo ACCEPT_EULA=Y yum install -y msodbcsql17

更新了我的 Python 代码中的连接字符串驱动程序名称:

Driver={ODBC Driver 17 for SQL Server}

© www.soinside.com 2019 - 2024. All rights reserved.