2016-01-08 29 views
17

Próbuję połączyć się z bazą danych postgres za pomocą psycopg2 z sslmode = "wymagany" parametr; Jednak uzyskać następujący błądObsługa Psycopg2 Python SSL nie jest kompilowana w

psycopg2.OperationalError: sslmode value "require" invalid when SSL support is not compiled in 

heres kilka szczegółów o moim systemie

  • Mac OS X El Capitan
  • Python 2.7
  • zainstalowana psycopg2 poprzez pip
  • Pythona zainstalowana poprzez homebrew

Ją e to, co starałem się zrobić, aby rozwiązać problem

  • brew uninstall python
  • which python nadal pokazuje Pythona żyjących w /usr/local/bin/python, starał się odinstalować ten jednak nie mógł. I dowiedział się, że jest to pyton, że system operacyjny używa i nie powinny być odinstalowane jakikolwiek
  • brew install python --with-brewed-openssl --build-from-source
  • pip uninstall psycopg2
  • pip install psycopg2

Po zrobieniu tego wszystkiego, wyjątek nadal dzieje. Używam tego skryptu Pythona poprzez #!/usr/bin/env python Nie wiem, czy to ważne, ale to jest inny katalog niż ten, który which python pokazuje

+0

Czy baza danych zawiera wymagane wsparcie SSL? – hkBst

+0

Czy możesz podać wynik polecenia 'pip install psycopg2'? Również, którą wersję psycopg zainstalowałeś (widoczny z 'pip list')? –

+0

@ andreas-hofmann 'instalacja pip psycopg2' pokazuje' Wymaganie już spełnione (użyj - upgrade do aktualizacji): psycopg2 w/usr/local/lib/python2.7/site-packages'. Kiedy uruchamiam 'pip list', otrzymuję' psycopg2 (2.6.1) ' – user2158382

Odpowiedz

-4

próby zainstalowania psycopg2 od MacPorts

sudo port install py27-psycopg2 
+0

Dlaczego w dół na MacPorts? –

6

Skoro instalacji poprzez pip , powinieneś używać najnowszej wersji psycopg2 (2.6.1). Po krótkim wykopaniu kodu wydaje się, że wyjątek jest zgłaszany w connection_int.c, który bezpośrednio wywołuje biblioteki postgresql-c, aby skonfigurować połączenie db. Wezwanie dzieje się tak:

self->pgconn = pgconn = PQconnectStart(self->dsn); 

Dprintf("conn_connect: new postgresql connection at %p", pgconn); 

if (pgconn == NULL) 
{ 
    Dprintf("conn_connect: PQconnectStart(%s) FAILED", self->dsn); 
    PyErr_SetString(OperationalError, "PQconnectStart() failed"); 
    return -1; 
} 
else if (PQstatus(pgconn) == CONNECTION_BAD) 
{ 
    Dprintf("conn_connect: PQconnectdb(%s) returned BAD", self->dsn); 
    PyErr_SetString(OperationalError, PQerrorMessage(pgconn)); 
    return -1; 
} 

słowa kluczowe, które zostały wyszczególnione w instrukcjach połączenia do psycopg2.connect() są obsługiwane do tej funkcji, a błędy są zwracane jako wyjątku OperationalError.

Błąd jest faktycznie generowany bezpośrednio w postgresql-lib - możesz chcieć sprawdzić, której wersji używasz, jak został on zbudowany i, jeśli to możliwe, zaktualizować go do wersji z obsługą SSL lub przebudować ją ze źródła z włączonym SSL.

PostgreSQL-docs stwierdzić również, że brakuje obsługę SSL podniesie błąd, jeśli sslmode jest ustawiony na wymagają, zweryfikować-ca lub zweryfikować pełna. Zobacz here pod numerem sslmode w celach informacyjnych.

The postgres-website wymienia kilka sposobów instalacji PostgreS z pakietów binarnych, dzięki czemu możesz wybrać taki, który odpowiada Twoim potrzebom. Nie znam OS X, więc nie mam rekomendacji, co jest najlepsze.

This pytanie może być pomocne.

Musisz również ponownie zainstalować moduł psycopg2, pamiętaj, aby użyć nowo zainstalowanej biblioteki podczas jej odbudowywania. Odwołaj się do połączonego pytania (krótko mówiąc, musisz podać ścieżkę do pg_config, która jest dołączona do twojej nowej instalacji do $ PATH podczas uruchamiania pip install psycopg2).

5

Otrzymany błąd jest spowodowany przez problem z samym PostgreSsem, a nie psycopg2.

psycopg2.OperationalError: sslmode value "require" invalid when SSL support is not compiled in 

Powyższe wskazuje, że wersja PostgreSQL że psycopg2 jest zbudowany przeciwko nie obsługuje SSL skompilowany w. Podczas próby nawiązania połączenia z systemem serwera Posgres z ssl=require zgłasza ten błąd.

Nie wspominając, jak został zainstalowany Postgres ale skoro używasz Homebrew dla innych rzeczy, polecam również zainstalować PostgreSQL w ten sam sposób:

$ brew update 
$ brew install postgresql 

formula for postgresql pokazuje, że zależy to od openssl i opracowuje z ustawionym flagą --with-openssl. Zainstaluje również potrzebne nagłówki. Po tym kroku może być konieczne ponowne zainstalowanie psycopg2, aby upewnić się, że wybrano odpowiednie biblioteki/wersje.

Co ciekawe, istnieje bug listed against conda który wymienia ten sam błąd, który zgłaszania występujących podczas wersja Conda z psycopg2 - połączone w systemie z Homebrew PostgreSQL - został zainstalowany na systemie bez sugerując brakujące biblioteki SSL może również wywołać ten.

Sugeruję odinstalowanie wszystkich istniejących wersji PostgreSQL (w tym zainstalowanych za pośrednictwem Homebrew) przed ponowną instalacją, aby zminimalizować ryzyko użycia niewłaściwego.

3

Jak powiedzieli inni, komunikat o błędzie wydaje się pochodzić z PostgreSQL. Można to sprawdzić przez wpisanie: psql sslmode=require jeśli to daje terminal pgsql następnie SSL współpracuje z PostgreSQL, o ile błędy to nie

spróbować usunąć i ponownie zainstalować postgres ze wsparciem openssl:

brew uninstall postgres 
brew update 
brew install postgres --with-openssl 

Alternatywnie, i tak proponuję, jest jeden instalator z jednym kliknięciem na http://postgresapp.com, który może również ułatwić jego instalację. Postępuj zgodnie z instrukcjami na stronie, aby zainstalować ją poprawnie.

Kiedy zrobiłem to na Yosemite on zainstalowany w ~/Library/Application \ Support/Postgres93/var

Będziesz także chcą utworzyć certyfikat (może to być także wtedy, gdy błąd pochodzi) albo od rejestratora, jeśli będzie on dostępny publicznie lub podpisany samodzielnie, jeśli dotyczy on środowiska programistycznego/testowego.

openssl req -new -text -out server.req 
openssl rsa -in privkey.pem -out server.key 
rm privkey.pem 
openssl req -x509 -in server.req -text -key server.key -out server.crt 
chmod og-rwx server.key 

Przejdź do katalogu config, domyślnie jest to: ~/Library/Application \ Support/Postgres93/var

Włącz obsługę SSL:

vim postgresql.conf 
# change this: 
# ssl = on 
# to this: 
ssl = on 

Ponowne uruchomienie aplikacji, a następnie sprawdzić ssl z psql "sslmode=require"

Jeśli to działa, spróbuj użyć kodu Pythona. Jeśli działa z powyższym kodem, ale nie z Pythonem, to z pewnością jest to problem z kodem Pythona, który musi zostać rozwiązany.

6

Miałem ten sam błąd, który okazał się być, ponieważ używałem wersji psycopg2 Anacondy. Aby to naprawić, musiałem dostosować VictorF's solution from here i uruchom:

conda uninstall psycopg2 
sudo ln -s /Users/YOURUSERNAME/anaconda/lib/libssl.1.0.0.dylib /usr/local/lib 
sudo ln -s /Users/YOURUSERNAME/anaconda/lib/libcrypto.1.0.0.dylib /usr/local/lib 
pip install psycopg2 

Następnie po uruchomieniu conda list zobaczysz psycopg2 zainstalowany <pip> w prawej kolumnie. Potem ponownie uruchomiłem Pythona i wszystko działało.

1

Ponieważ nie mogę komentować:
Dodanie odpowiedzi Brideau'a, że ​​działa to tylko po zmianie mojej wersji Postgres.

brew uninstall postgres 
brew update 
brew install postgres --with-openssl 

Następnie uruchom kod dostarczony przez Brideau i powinien zadziałać.

0

Jeśli używasz psycopg2 w wersji 2.2.1 lub v.2.6 (tak jak ja), odpowiedzią było proste uaktualnienie do wersji 2.7. Po przeczytaniu release notes dla psycopg2, wprowadzono niewielką poprawkę dla protokołu SSL, chociaż nie wygląda to szczególnie trafnie.

Moja konfiguracja była następująca:

  • Mac OS X El Capitan 10.11.6
  • psycopg2 2.6.2 zainstalowany poprzez pip
  • PostgreSQL zainstalowane poprzez Enterprise DB Installer

Running pip uninstall psycopg2, po której następuje pip install psycopg2 rozwiązane sprawy.