Pyodbc - “未找到数据源名称,未指定默认驱动程序”
Posted
技术标签:
【中文标题】Pyodbc - “未找到数据源名称,未指定默认驱动程序”【英文标题】:Pyodbc - "Data source name not found, and no default driver specified" 【发布时间】:2013-04-23 05:12:38 【问题描述】:我很难让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 =
【问题讨论】:
你尝试过这个:......你可能需要从 /etc/odbc.ini 和 /usr/local/etc/odbcinst.ini 复制 /usr/local/etc/odbc.ini 从 /etc /odbcinst.ini(至少这是我的经验,可能是因为我的 linux 发行版中已经安装了 unixODBC) 【参考方案1】:我相信您的问题的答案是在您的 ~/.odbc.ini 文件中您说要使用驱动程序 PostgreSQL
- 但您尚未在 /etc/odbcinst.ini 文件中定义该驱动程序。尝试将PostgreSQL
更改为PostgreSQL ANSI
或PostgreSQL Unicode
(两者都在/etc/odbcinst.ini 中定义)。
【讨论】:
你能在这里输入一个例子吗?我应该将“PostgreSQL”替换为“PostgreSQL Unicode”还是替换为“psqlodbcw.so”? 尝试将PostgreSQL
替换为PostgreSQL Unicode
或PostgreSQL ANSI
。
试过了,还在/etc/odbcinst.ini中添加了驱动文件的全路径,没有效果,还是一样...
摆脱你的 ~/.odbc.ini 并将你的连接字符串更改为conn = pyodbc.connect("DRIVER=PostgreSQL test;SERVER=localhost;DATABASE=test;USER=openerp;OPTION=3;")
您之前完全正确,我的错误是执行相同的 Python 语句(必须将 DRIVER=PostgreSQL 更改为 DRIVER=PostgreSQL Unicode),并且一切正常。非常感谢。【参考方案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
而改变。
【讨论】:
谢谢你,但我有一个问题。这个修复对我有用,即使我在我的代码中使用 os.environ["ODBCINI"]="/etc/odbc.ini" os.environ["ODBCSYSINI"]="/etc/odbcinst.ini" 。似乎不知何故,由于 /etc/**sudo** odbcinst -j
时显示的位置),因此文件被程序忽略(不以 root 身份运行)。这对我来说似乎很奇怪,因为 odbc 文件具有公共读取访问权限。你知道这是怎么回事吗?对我来说,这一切都归结为一个空白字符。
$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 /wH ... 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
。只需触摸该文件即可。
【讨论】:
【参考方案6】:对我来说,我发现这个问题是由于混合了 32 位和 64 位二进制文件造成的。关于修复那个,我只能说“祝你好运,尽量保持 32 或 64”。 ?
【讨论】:
以上是关于Pyodbc - “未找到数据源名称,未指定默认驱动程序”的主要内容,如果未能解决你的问题,请参考以下文章