Подтвердить что ты не робот

Psycopg2 Поддержка протокола Python не скомпилирована в

Я пытаюсь подключиться к моей базе данных postgres, используя psycopg2 с параметром sslmode = 'required'; однако я получаю следующую ошибку

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

Вот пара деталей о моей системе

  • Mac OS X El Capitan
  • Python 2.7
  • Установлен psycopg2 через pip
  • Установленный python через homebrew

Вот что я пытался сделать, чтобы исправить проблему

  • brew uninstall python
  • which python все еще показывает python, живущий в /usr/local/bin/python, попытался удалить это, но не смог. И слышал, что это питон, который использует ОС, и его не следует удалять в любом случае.
  • brew install python --with-brewed-openssl --build-from-source
  • pip uninstall psycopg2
  • pip install psycopg2

Выполняя все это, исключение все еще происходит. Я запускаю этот python script через #!/usr/bin/env python Не уверен, если это имеет значение, но это другой каталог, чем тот, который which python показывает

4b9b3361

Ответ 1

Поскольку вы устанавливаете через pip, вы должны использовать самую последнюю версию psycopg2 (2.6.1). После небольшого копания кода кажется, что исключение вызывается в connection_int.c, который напрямую вызывает библиотеки postgresql-c для настройки db-соединения. Вызов происходит так:

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

К этой функции привязаны ключевые слова, указанные в инструкции connect к psycopg2.connect(), и ошибки возвращаются как исключение OperationalError.

Ошибка создается непосредственно в postgresql-lib - вы можете проверить, какую версию вы используете, как она была построена и, если возможно, обновить ее до версии с поддержкой SSL или перестроить ее из источника с помощью SSL включен.

В postgresql-документах также указывается, что отсутствие поддержки SSL вызовет ошибку, если для параметра sslmode установлено значение требуется, подтвердить-ca или проверить-полно. См. здесь в разделе sslmode для справки.

postgres-website перечисляет несколько способов установки postgres из двоичных пакетов, поэтому вы можете выбрать тот, который соответствует вашим потребностям. Я не знаком с OSX, поэтому у меня нет рекомендаций, которые лучше всего.

Этот вопрос также может быть полезен.

Вам также необходимо переустановить модуль psycopg2, обязательно используйте вновь установленный lib при его восстановлении. Обратите внимание на связанный вопрос (короче говоря, вам нужно будет поместить путь к pg_config, который включен в вашу новую установку, в $PATH при запуске pip install psycopg2).

Ответ 2

У меня была такая же ошибка, которая оказалась, потому что я использовал версию psacopg2 от Anaconda. Чтобы исправить это, я применил решение VictorF отсюда и запустил:

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

Затем, когда вы запустите conda list, вы увидите, что psycopg2 установлен с <pip> в крайнем правом столбце. После этого я только что перезапустил Python, и все сработало.

Ответ 3

Ошибка, которую вы получаете, вызвана проблемой самого Postgres, а не psycopg2.

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

Вышеупомянутое указывает, что версия Postgres, которая psycopg2 построена против, не имеет поддержки SSL, скомпилированной в. Когда вы пытаетесь подключиться к запущенному серверу Posgres с помощью ssl=require, он выдает эту ошибку.

Вы не упомянули, как вы установили Postgres, но поскольку вы используете Homebrew для других целей, я рекомендую вам также установить Postgres так же:

$ brew update
$ brew install postgresql

Формула для postgresql показывает, что она зависит от openssl и компилируется с установленным флагом --with-openssl. Он также установит необходимые заголовки libpq. Возможно, вам потребуется переустановить psycopg2 после этого шага, чтобы убедиться, что он подбирает правильные библиотеки/версию.

Интересно, что есть ошибка указанная в отношении conda, которая содержит ту же ошибку, о которой сообщается, когда версия conda psycopg2 - связана на системе с postgres Homebrew - был установлен в системе без, предлагая, чтобы отсутствующие библиотеки SSL также могли инициировать это.

Я бы предложил удалить все существующие версии Postgres (включая любые установленные через Homebrew) перед повторной установкой, чтобы свести к минимуму риск использования неправильного.

Ответ 4

Как говорили другие, сообщение об ошибке похоже на Postgres. Вы можете проверить это, набрав: psql sslmode=require, если он дает вам pgsql-терминал, тогда ssl работает с postgres, если это ошибки, то это не

Попробуйте удалить postgres и переустановить с поддержкой openssl:

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

В качестве альтернативы, и так я предлагаю, есть установщик с одним щелчком мыши в http://postgresapp.com, который также может облегчить чтобы установить его. Следуйте инструкциям на сайте, чтобы установить его правильно.

Когда я сделал это на Yosemite, он был установлен в ~/Library/Application\Support/Postgres93/var

Вы также захотите создать сертификат (также может быть, откуда исходит ошибка) либо от регистратора, если это будет публично открытым в малейшей или самоподписанной, если это для среды dev/test.

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

Перейдите в свой каталог конфигурации, по умолчанию это: ~/Library/Application\Support/Postgres93/var

Включить поддержку ssl:

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

Перезагрузите приложение, а затем проверьте ssl с помощью psql "sslmode=require"

Если это работает, попробуйте его через свой код Python. Если он работает с указанным выше кодом, но не с Python, то это определенно проблема кода на Python, с которой нужно проработать.

Ответ 5

Как я не могу комментировать:
Добавив в Brideau ответ, что это только сработало для меня после изменения моей версии Postgres.

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

Затем запустите код, предоставленный Brideau, и он должен работать.

Ответ 6

Если вы используете v2.6.1 или v2.6.2 psycopg2 (например, я), ответ был простым обновлением до версии v2.7. Читая примечания к выпуску для psycopg2, было небольшое исправление для SSL, хотя оно не выглядит особенно актуальным.

Моя настройка была следующей:

  • Mac OS X El Capitan 10.11.6
  • psycopg2 2.6.2, установленный через pip
  • PostgreSQL, установленный с помощью Enterprise DB Installer

Запуск pip uninstall psycopg2, за которым следует pip install psycopg2 разрешенные вопросы.

Ответ 7

Попробуйте установить psycopg2 из MacPorts

 sudo port install py27-psycopg2