pyodbc - [unixODBC] [驱动程序管理器]找不到数据源名称,并且未指定默认驱动程序

时间:2015-01-28 18:25:22

标签: pyodbc

我正在建立一个从python连接到AWS Redshift数据库的系统。我在想python脚本中有什么问题,因为我可以通过isql连接。我已经安装了所有相关的软件包,我可以通过isql连接如下:

$ isql rndredshift readonly ***** -v
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> quit

但是,我的python脚本无法连接。这是脚本:

import pyodbc
import sys

def main():
   redshift_conn_str = assemble_connection_string(
        Driver='{PostgreSQL}',
        Server='10.191.4.97',
        ServerName='rndredshift',
        Port='5439',
        Database='prod',
        Uid='readonly',
        Pwd='*******'
    )
    print("===========")
    print(redshift_conn_str)
    print("===========")
    new_conn2 = pyodbc.connect(redshift_conn_str)
    print(psql.read_sql('select top 10 * from rawdb.raw_imprequest_20150101', new_conn2))

def assemble_connection_string(**kwargs):
    return ';'.join([k + '=' + v for (k, v) in kwargs.items()])

if __name__ == '__main__':
    sys.exit(main())

这是输出:

===========
Uid=readonly;Database=prod;ServerName=rndredshift;Driver={PostgreSQL};  Server=10.191.4.97;Pwd=********;Port=5439
===========
Traceback (most recent call last):
  File "test_redshift.py", line 24, in <module>
    sys.exit(main())
  File "test_redshift.py", line 17, in main
    new_conn2 = pyodbc.connect(redshift_conn_str)
pyodbc.Error: ('IM002', '[IM002] [unixODBC][Driver Manager]Data source name not found, and no default driver specified (0) (SQLDriverConnectW)')

安装了PosgreSQL驱动程序:

$ odbcinst -q -d
[PostgreSQL]
[MySQL]

数据源已配置:

$ odbcinst -q -s
[rndredshift]

4 个答案:

答案 0 :(得分:0)

如果您正在使用DSN,则需要在连接字符串中指定该DSN。此外,如果您想使用无DSN连接,我相信关键字是SERVER而不是SERVERNAME。

试试这个连接字符串?

Uid=readonly;Database=prod;DSN=rndredshift;Driver={PostgreSQL};Pwd=********;

确保在odbc.ini中指定完整的服务器名称和端口。另外,既然您正在使用PostgreSQL,那么您是否有任何理由不使用本机PostgreSQL驱动程序?

https://wiki.postgresql.org/wiki/Psycopg

祝你好运!

答案 1 :(得分:0)

另外,我一直对获取和安装PostgreSQL驱动程序的方法感到困惑。当我安装unixODBC时,创建了odbcinst.ini文件并包含一个PostgreSQL驱动程序的条目,看起来是这样的:

[PostgreSQL]
Description     = ODBC for PostgreSQL
Driver          = /usr/lib/psqlodbc.so
Setup           = /usr/lib/libodbcpsqlS.so
Driver64        = /usr/lib64/psqlodbc.so
Setup64         = /usr/lib64/libodbcpsqlS.so
FileUsage       = 1

但是,Driver和Driver64的文件不在系统上。那么,我安装了postgresql-odbc,它给了我缺少的库。有一个更好的方法吗?正如我之前提到的,isql工作正常,所以我仍然认为这是一个python问题。

答案 2 :(得分:0)

我决定尝试使用psycopg2包,我有一个连接工作!这是我的剧本:

import sys
import psycopg2

def main():

    conn_string = "host='10.191.4.97' dbname='prod' user='readonly' password='****' port='5439'"
    print("===========")
    print(conn_string)
    print("===========")
    new_conn2 = psycopg2.connect(conn_string)
    print("Connected using psycopg2!")

if __name__ == '__main__':
    sys.exit(main())

所以,虽然我很高兴能够连接,但仍然存在关于pyodbc和PostgreSQL连接字符串的问题。想法?

答案 3 :(得分:-1)

这里是连接字符串:     UID =只读;数据库= PROD;服务器名称= rndredshift;驱动器= {的PostgreSQL};服务器= 10.191.4.97; PWD = ********;端口= 5439

使用DSN代替ServerName并不起作用。