我正在建立一个从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]
答案 0 :(得分:0)
如果您正在使用DSN,则需要在连接字符串中指定该DSN。此外,如果您想使用无DSN连接,我相信关键字是SERVER而不是SERVERNAME。
试试这个连接字符串?
Uid=readonly;Database=prod;DSN=rndredshift;Driver={PostgreSQL};Pwd=********;
确保在odbc.ini中指定完整的服务器名称和端口。另外,既然您正在使用PostgreSQL,那么您是否有任何理由不使用本机PostgreSQL驱动程序?
祝你好运!答案 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并不起作用。