2015-12-22 14 views
7

Cercando di connettersi a Postgres usando pyodbc.Connetti pyodbc a Postgres

posso collegare al DB con isql:

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

Returns:

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

Ma quando provo a connettermi con pyodbc:

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

ottengo il seguente errore :

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

file di obdc.ini assomiglia a questo:

[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  = 

file di ODBCINST.INI assomiglia a questo:

[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 

Note:

  • Ubuntu 14.04
  • Python 3
  • Postgresql 9.3

Ho usato psycopg2 in passato per collegarmi a Postgres, tuttavia la mia attuale azienda utilizza Netezza, Postgres e MySQL. Voglio scrivere 1 modulo di connessione e utilizzare driver diversi per connettersi ai diversi database. Qualsiasi aiuto sarebbe molto apprezzato.

- Grazie

+0

Per un primo tentativo si poteva provare a includere tutto rguments dalla voce odbc.ini nella stringa di connessione e vedere se funziona. –

+0

@GordThompson - grazie. Provato e ancora senza fortuna. –

+1

Funziona se si usa 'DSN = my-connector'? –

risposta

4

Dal momento che si dispone già di un DSN di lavoro definito in odbc.ini si può semplicemente utilizzare che:

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

Inoltre, per la cronaca, che gli spazi bianchi in più in collegamento stringa potrebbe aver confuso il problema perché questo ha funzionato bene per me, sotto Python 2.7 almeno

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()