2015-12-22 140 views
7

尝试使用pyodbc连接到Postgres。将pyodbc连接到Postgres

我可以使用isql连接到数据库:

echo "select 1" | isql -v my-connector 

返回:

+---------------------------------------+ 
| Connected!       | 
|          | 
| sql-statement       | 
| help [tablename]      | 
| quit         | 
|          | 
+---------------------------------------+ 
SQL> select 1 
+------------+ 
| ?column? | 
+------------+ 
| 1   | 
+------------+ 
SQLRowCount returns 1 
1 rows fetched 

但是,当我尝试使用pyodbc连接:

import pyodbc 
con = pyodbc.connect("DRIVER={PostgreSQL Unicode}; DATABASE=<dbname>;  UID=<username>; PWD=<password>; SERVER=localhost; PORT=5432;") 

我得到以下错误:

pyodbc.Error: ('08001', '[08001] [unixODBC]connction string lacks some options (202) (SQLDriverConnect)') 

obdc.ini文件看起来像这样:

[my-connector] 
Description   = PostgreSQL connection to '<dbname>' database 
Driver    = PostgreSQL Unicode 
Database   = <dbname> 
Servername   = localhost 
UserName   = <username> 
Password   = <password> 
Port    = 5432 
Protocol   = 9.3 
ReadOnly   = No 
RowVersioning  = No 
ShowSystemTables = No 
ShowOidColumn  = No 
FakeOidIndex  = No 
ConnSettings  = 

ODBCINST.INI文件是这样的:

[PostgreSQL ANSI] 
Description  = PostgreSQL ODBC driver (ANSI version) 
Driver   = psqlodbca.so 
Setup   = libodbcpsqlS.so 
Debug   = 0 
CommLog   = 1 
UsageCount  = 1 

[PostgreSQL Unicode] 
Description  = PostgreSQL ODBC driver (Unicode version) 
Driver   = psqlodbcw.so 
Setup   = libodbcpsqlS.so 
Debug   = 0 
CommLog   = 1 
UsageCount  = 1 

注:

  • 的Ubuntu 14.04
  • 的Python 3
  • Postgresql 9.3

我以前用psycopg2连接到Postgres,但是我现在的公司使用Netezza,Postgres和MySQL。我想编写1个连接模块,并使用不同的驱动程序连接到不同的数据库。 任何帮助将不胜感激。

- 感谢

+0

一开始,你可以尝试,包括所有的A来自连接字符串中的odbc.ini条目的参数,并查看是否有效。 –

+0

@GordThompson - 谢谢。试过了,仍然没有运气。 –

+1

如果你只是使用'DSN = my-connector',它会工作吗? –

回答

4

既然你已经有一个工作DSN定义在ODBC.INI你可以使用:

con = pyodbc.connect("DSN=my-connector") 

而且,备案,额外的空格在您的连接字符串可能是混乱的问题,因为这个工作对我很好,Python 2.7版下至少

import pyodbc 
conn_str = (
    "DRIVER={PostgreSQL Unicode};" 
    "DATABASE=postgres;" 
    "UID=postgres;" 
    "PWD=whatever;" 
    "SERVER=localhost;" 
    "PORT=5432;" 
    ) 
conn = pyodbc.connect(conn_str) 
crsr = conn.execute("SELECT 123 AS n") 
row = crsr.fetchone() 
print(row) 
crsr.close() 
conn.close()