2015-12-22 12 views
7

Próbujesz połączyć się z Postgresem używając pyodbc.Podłącz pyodbc do PostgreStu

mogę połączyć się z DB z isql:

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

Powroty:

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

Ale gdy próbuję się połączyć z pyodbc:

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

I pojawia się następujący błąd :

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

obdc.ini plik wygląda tak:

[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 plik wygląda tak:

[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 

Uwagi:

  • Ubuntu 14.04
  • Pythonie 3
  • Postgresql 9.3

Używałem psycopg2 w przeszłości do łączenia się z Postgresem, jednak moja obecna firma używa Netezza, Postgres i MySQL. Chcę napisać 1 moduł połączenia i używać różnych sterowników do łączenia się z różnymi bazami danych. Każda pomoc będzie bardzo ceniona.

- Dzięki

+0

Na początek możesz spróbować włączyć wszystkie rguments z wpisu odbc.ini w łańcuchu połączenia i sprawdź, czy to działa. –

+0

@GordThompson - dzięki. Próbowałem i nadal nie ma szczęścia. –

+1

Czy to działa, jeśli używasz 'DSN = my-connector'? –

Odpowiedz

4

Skoro masz już DSN pracy zdefiniowane w ODBC.INI można po prostu użyć tego:

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

Ponadto, dla przypomnienia, że ​​dodatkowe spacje w związku ciąg mógł być mylący, ponieważ to działało dobrze dla mnie, pod Pythonem 2.7 przynajmniej

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