Psycopg2 Python SSL支持未编译

use*_*382 17 python postgresql ssl psycopg2 python-2.7

我正在尝试使用psycopg2与sslmode ='required'参数连接到我的postgres数据库; 但是,我收到以下错误

psycopg2.OperationalError: sslmode value "require" invalid when SSL support is not compiled in
Run Code Online (Sandbox Code Playgroud)

这是关于我的系统的几个细节

  • Mac OS X El Capitan
  • Python 2.7
  • 通过pip安装psycopg2
  • 通过自制软件安装python

这是我试图解决问题的方法

  • brew uninstall python
  • which python仍然显示python生活在/usr/local/bin/python,试图卸载这个但不能.并且听说这是操作系统使用的python,不管怎么说都不应该卸载
  • brew install python --with-brewed-openssl --build-from-source
  • pip uninstall psycopg2
  • pip install psycopg2

完成所有这些后,异常仍然发生.我通过运行这个python脚本#!/usr/bin/env python不知道它的问题,但是这是一个不同的目录比一个which python节目

and*_*ann 6

由于您是通过pip安装的,因此您应该使用最新版本的psycopg2(2.6.1).在对代码进行了一些挖掘之后,看起来异常是在connection_int.c中抛出的,它直接调用postgresql -c-libraries来设置db-connection.这样的调用就像这样:

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;
}
Run Code Online (Sandbox Code Playgroud)

在您的connect语句中指定给psycopg2.connect()的关键字正在处理该函数,并且错误将作为OperationalError异常返回.

该错误实际上是直接在postgresql-lib中生成的 - 您可能想要检查您正在使用哪个版本,如何构建它,如果可能,请将其升级到支持SSL的版本,或者在启用SSL的情况下从源重建它.

postgresql-docs还声明如果sslmode设置为require,verify-caverify-full,则缺少SSL支持将引发错误.请参阅此处sslmode供参考.

Postgres的-网站列出了几种方法来安装从二进制包Postgres的,所以你可以选择一个适合您的需求.我不熟悉OSX,所以我没有推荐什么是最好的.

这个问题也可能有所帮助.

您还需要重新安装psycopg2模块,确保在重建时使用新安装的lib.请参阅链接的问题(简而言之,您需要pg_config在运行时将新安装中包含的路径放置到$ PATH pip install psycopg2).


Bri*_*eau 6

我有同样的错误,原来是因为我使用的是anaconda版本的psycopg2.为了解决这个问题,我从这里开始调整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
Run Code Online (Sandbox Code Playgroud)

然后当你运行时,conda list你会<pip>在最右边的列中看到安装的psycopg2 .之后,我刚刚重启Python,一切正常.


mfi*_*tzp 5

您收到的错误是由Postgres本身的问题引起的,而不是psycopg2.

psycopg2.OperationalError: sslmode value "require" invalid when SSL support is not compiled in
Run Code Online (Sandbox Code Playgroud)

以上表示psycopg2构建的Postgres版本没有编译的SSL支持.当您尝试连接到正在运行的Posgres服务器时,ssl=require会抛出此错误.

你没有提到你如何安装Postgres,但由于你使用Homebrew做其他事情,我建议你也以同样的方式安装Postgres:

$ brew update
$ brew install postgresql
Run Code Online (Sandbox Code Playgroud)

postgresql公式显示它依赖于标志集openssl并进行编译--with-openssl.它还将安装必要的libpq标头.您可能需要psycopg2在此步骤之后重新安装,以确保它获取正确的库/版本.

有趣的是,针对conda列出了一个错误,列出了psycopg2在系统上安装了带有Homebrew postgres的系统的conda版本时报告的相同错误,表明缺少SSL库也可以触发此错误.

我建议在重新安装之前卸载任何现有的Postgres版本(包括通过Homebrew安装的任何版本),以最大限度地降低使用错误的风险.


ana*_*nik -4

psycopg2尝试从MacPorts安装

 sudo port install py27-psycopg2
Run Code Online (Sandbox Code Playgroud)