2016-01-08 20 views
17

Tôi đang cố gắng kết nối với cơ sở dữ liệu postgres của mình bằng psycopg2 với tham số sslmode = 'required'; Tuy nhiên, tôi nhận được lỗi sauPsycopg2 Hỗ trợ SSL Python không được biên soạn trong

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

Heres một vài chi tiết về hệ thống của tôi

  • Mac OS X El Capitan
  • Python 2.7
  • cài đặt psycopg2 qua pip
  • cài đặt python qua homebrew

Cô ấy e là những gì tôi đã cố gắng để làm gì để khắc phục vấn đề

  • brew uninstall python
  • which python vẫn cho thấy trăn sống trong /usr/local/bin/python, cố gắng gỡ bỏ cài đặt này nhưng couldnt. Và nghe nói rằng đây là trăn rằng hệ điều hành sử dụng và không nên được gỡ bỏ anyways
  • brew install python --with-brewed-openssl --build-from-source
  • pip uninstall psycopg2
  • pip install psycopg2

Sau khi thực hiện tất cả điều này, ngoại trừ vẫn xảy ra. Tôi đang chạy script python này qua #!/usr/bin/env python Không chắc chắn nếu nó quan trọng, nhưng đó là một thư mục khác so với cái mà which python lãm

+0

Cơ sở dữ liệu của bạn có được hỗ trợ ssl bắt buộc được biên soạn không? – hkBst

+0

Bạn có thể cung cấp đầu ra của lệnh 'pip install psycopg2' không? Ngoài ra, bạn đã cài đặt phiên bản psycopg nào (hiển thị với 'danh sách pip')? –

+0

@ andreas-hofmann 'pip install psycopg2' hiển thị' Yêu cầu đã thỏa mãn (sử dụng - upgrade để nâng cấp): psycopg2 trong/usr/local/lib/python2.7/site-packages'. Khi tôi chạy 'pip list', tôi nhận được' psycopg2 (2.6.1) ' – user2158382

Trả lời

-4

Cố gắng cài đặt psycopg2 từ MacPorts

sudo port install py27-psycopg2 
+0

Tại sao downvote trên MacPorts? –

6

Vì bạn đang cài đặt qua pip , bạn nên sử dụng phiên bản mới nhất của psycopg2 (2.6.1). Sau một chút đào qua mã, có vẻ như ngoại lệ đang được ném vào connection_int.c, nó gọi trực tiếp thư viện postgresql-c để thiết lập kết nối db. Cuộc gọi sẽ xảy ra như vậy:

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; 
} 

Các từ khóa đã được quy định trong bản Tuyên Bố kết nối của bạn để psycopg2.connect() đang được xử lý để hàm và các lỗi được trả về như OperationalError ngoại lệ.

Lỗi thực sự được tạo trực tiếp trong postgresql-lib - bạn có thể kiểm tra phiên bản bạn đang sử dụng, cách xây dựng và, nếu có thể, hãy nâng cấp lên phiên bản có hỗ trợ SSL hoặc xây dựng lại từ nguồn đã bật SSL.

Các postgresql-docs cũng nêu rằng thiếu hỗ trợ SSL sẽ nâng cao một lỗi, nếu sslmode được thiết lập để đòi hỏi, verify-ca hoặc xác minh đầy. Xem here dưới sslmode để tham khảo.

postgres-website liệt kê một số cách để cài đặt postgres từ gói nhị phân, vì vậy bạn có thể chọn một cách phù hợp với nhu cầu của mình. Tôi không quen với OSX, vì vậy tôi không có đề xuất gì tốt nhất.

This câu hỏi cũng có thể hữu ích.

Bạn cũng cần phải cài đặt lại mô-đun psycopg2, hãy đảm bảo sử dụng lib mới được cài đặt khi xây dựng lại nó. Tham khảo câu hỏi được liên kết (trong ngắn hạn, bạn sẽ cần phải đặt đường dẫn đến pg_config được bao gồm trong cài đặt mới của bạn để $ PATH khi chạy pip install psycopg2).

5

Lỗi bạn đang nhận được gây ra bởi sự cố với chính Postgres và không phải là psycopg2.

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

Trên đây chỉ ra rằng phiên bản của Postgres rằng psycopg2 được xây dựng lại không có hỗ trợ SSL biên soạn. Khi bạn cố gắng để kết nối đến máy chủ Posgres chạy với ssl=require nó throws lỗi này.

Bạn không đề cập đến cách bạn cài đặt Postgres nhưng kể từ khi bạn đang sử dụng Homebrew cho những thứ khác, tôi khuyên bạn cũng cài đặt Postgres theo cùng một cách:

$ brew update 
$ brew install postgresql 

Các formula for postgresql cho thấy rằng nó phụ thuộc vào openssl và biên dịch với bộ cờ --with-openssl. Nó cũng sẽ cài đặt các tiêu đề cần thiết libpq. Bạn có thể cần phải cài đặt lại psycopg2 sau bước này để đảm bảo nó chọn đúng thư viện/phiên bản.

Điều thú vị là có bug listed against conda liệt kê cùng một lỗi mà bạn báo cáo xảy ra khi phiên bản conda psycopg2 - được liên kết trên hệ thống với Homebrew postgres - đã được cài đặt trên hệ thống không có, cho thấy thư viện SSL bị thiếu cũng có thể kích hoạt tính năng này.

Tôi khuyên bạn nên gỡ cài đặt mọi phiên bản Postgres hiện có (bao gồm mọi phiên bản đã cài đặt qua Homebrew) trước khi cài đặt lại để giảm thiểu rủi ro sai.

3

Như những người khác đã nói, thông báo lỗi có vẻ như đến từ Postgres. Bạn có thể xác minh điều này bằng cách gõ: psql sslmode=require nếu nó mang lại cho bạn một thiết bị đầu cuối pgsql sau đó ssl làm việc với postgres, nếu nó lỗi sau đó nó không

Hãy thử và loại bỏ postgres và cài đặt lại với sự hỗ trợ openssl:

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

Ngoài ra, và đây là cách tôi muốn đề nghị, có một trình cài đặt một cú nhấp chuột tại http://postgresapp.com mà cũng có thể làm cho nó dễ dàng hơn để có được nó được cài đặt. Làm theo hướng dẫn trên trang web để cài đặt chính xác.

Khi tôi đã làm nó trên Yosemite nó được lắp đặt tại ~/Library/Application \ Support/Postgres93/var

Bạn cũng sẽ muốn tạo ra một giấy chứng nhận (điều này cũng có thể là nơi mà các lỗi là đến từ) hoặc từ một công ty đăng ký nếu điều này sẽ được công khai phải đối mặt với một chút hoặc tự ký nếu nó là cho một môi trường thử nghiệm/dev.

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 

Navigate vào thư mục cấu hình của bạn, theo mặc định nó là: ~/Library/Application \ Support/Postgres93/var

Enable hỗ trợ ssl:

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

Khởi động lại ứng dụng và sau đó kiểm tra ssl với psql "sslmode=require"

Nếu điều đó hoạt động thì hãy thử qua mã Python của bạn. Nếu nó hoạt động với mã ở trên, nhưng không phải Python thì nó chắc chắn là một vấn đề về mã Python cần được làm việc.

6

Tôi đã gặp lỗi tương tự, điều này hóa ra là vì tôi đang sử dụng phiên bản Anaconda của psycopg2. Để khắc phục điều đó, tôi đã thích ứng VictorF's solution from here và chạy:

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 

Sau đó, khi bạn chạy conda list bạn sẽ thấy psycopg2 cài đặt với <pip> trong cột bên phải. Sau đó, tôi vừa khởi động lại Python và mọi thứ đã hoạt động.

1

Vì tôi không thể nhận xét:
Thêm vào câu trả lời của Brideau rằng điều này chỉ làm việc cho tôi sau khi thay đổi phiên bản Postgres của tôi.

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

Sau đó chạy mã do Brideau cung cấp và nó sẽ hoạt động.

0

Nếu bạn đang sử dụng v2.6.1 hoặc v2.6.2 của psycopg2 (như tôi), câu trả lời là một nâng cấp đơn giản cho v2.7. Đọc release notes cho psycopg2, đã có một sửa chữa nhỏ cho SSL mặc dù nó không nhìn đặc biệt có liên quan.

thiết lập của tôi là như sau:

  • Mac OS X El Capitan 10.11.6
  • psycopg2 2.6.2 được cài đặt thông qua pip
  • PostgreSQL cài đặt qua Enterprise DB Installer

Chạy pip uninstall psycopg2 theo sau bởi pip install psycopg2 giải quyết vấn đề.

Các vấn đề liên quan