未在中编译Psycopg2 Python SSL支持
我正在尝试使用psycopg2和sslmode='required'参数连接到我的postgres数据库;但是,我得到了以下错误未在中编译Psycopg2 Python SSL支持,python,postgresql,python-2.7,ssl,psycopg2,Python,Postgresql,Python 2.7,Ssl,Psycopg2,我正在尝试使用psycopg2和sslmode='required'参数连接到我的postgres数据库;但是,我得到了以下错误 psycopg2.OperationalError: sslmode value "require" invalid when SSL support is not compiled in 这里有一些关于我的系统的细节 Mac OS X El Capitan Python 2.7 通过pip安装psycopg2 通过自制安装python 下面是我试图解决这个问题
psycopg2.OperationalError: sslmode value "require" invalid when SSL support is not compiled in
这里有一些关于我的系统的细节
- Mac OS X El Capitan
- Python 2.7
- 通过pip安装psycopg2
- 通过自制安装python
brew卸载python
仍然显示了生活在哪个python
中的python,试图卸载此文件,但无法卸载。听说这是操作系统使用的python,无论如何都不应该卸载/usr/local/bin/python
brew安装python——使用brew openssl——从源代码构建
pip卸载psycopg2
pip安装psycopg2
在完成所有这些之后,异常仍然会发生。我正在通过
#运行这个python脚本/usr/bin/env python
不确定它是否重要,但它与python显示的目录不同,请尝试从中安装psycopg2
由于您是通过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库中生成的-您可能需要检查您正在使用的版本、它是如何生成的,如果可能,请将其升级到支持SSL的版本,或者从启用SSL的源代码重新生成
postgresql文档还声明,如果sslmode设置为require、verify ca或verify full,则缺少SSL支持将引发错误。有关参考信息,请参见sslmode
下的
列出了从二进制软件包安装postgres的几种方法,因此您可以选择一种适合您需要的方法。我不熟悉OSX,所以我没有最好的建议
这个问题可能也有帮助
您还需要重新安装psycopg2模块,请确保在重建它时使用新安装的lib。请参阅链接问题(简而言之,在运行pip install psycopg2
时,您需要将新安装中包含的pg_config
路径放在$path中。)您收到的错误是由Postgres本身的问题引起的,而不是psycopg2
psycopg2.OperationalError: sslmode value "require" invalid when SSL support is not compiled in
上述情况表明,构建psycopg2
所依据的Postgres版本没有编译的SSL支持。当您尝试使用ssl=require
连接到正在运行的Posgres服务器时,它会抛出此错误
您没有提到如何安装Postgres,但由于您正在使用自制软件进行其他操作,我建议您也以同样的方式安装Postgres:
$ brew update
$ brew install postgresql
显示它依赖于openssl
,并使用--设置了openssl
标志进行编译。它还将安装必要的libpq
标题。完成此步骤后,您可能需要重新安装psycopg2
,以确保它选择正确的库/版本
有趣的是,有一个列表列出了您报告的相同错误,该错误发生在带有自制postgres的系统上链接的psycopg2
的conda版本安装在没有的系统上时,这表明缺少SSL库也会触发此错误
我建议在重新安装之前卸载任何现有的Postgres版本(包括任何通过自制安装的版本),以最大限度地降低使用错误版本的风险。正如其他人所说,错误消息似乎来自Postgres。您可以通过键入来验证这一点:
psql sslmode=require
如果它提供pgsql终端,那么ssl可以与postgres一起工作,如果它出错,那么它不会
尝试删除postgres并使用openssl支持重新安装:
brew uninstall postgres
brew update
brew install postgres --with-openssl
vim postgresql.conf
# change this:
# ssl = on
# to this:
ssl = on
或者,这是我建议的方式,有一个一键式安装程序,也可能使它更容易安装。按照网站上的说明正确安装
当我在Yosemite上安装它时,它安装在~/Library/Application\Support/Postgres93/var
您还需要从注册商处创建一个证书(这也可能是错误的来源),如果这是一个面向公众的证书,或者是针对开发/测试环境的自签名证书
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支持:
brew uninstall postgres
brew update
brew install postgres --with-openssl
vim postgresql.conf
# change this:
# ssl = on
# to this:
ssl = on
重新启动应用程序,然后使用psql“sslmode=require”检查ssl
如果这样做有效,那么请通过Python代码进行尝试。如果它能与上面的代码一起工作,但不能与Python一起工作,那么它肯定是一个需要解决的Python代码问题。我遇到了同样的错误,这是因为我使用的是Anaconda版本的psycopg2。要修复它,我必须调整并运行: 然后,当您运行
conda list
时,您将在最右边的列中看到安装有
的psycopg2。之后,我重新启动了Python,一切正常。因为我无法发表评论:Brideau的回答是,这只在我改变了Postgres的版本后对我有效
brew uninstall postgres
brew update
brew install postgres --with-openssl
然后运行Brideau提供的代码,它应该可以工作 如果您使用的是psycopg2的v2.6.1或v2.6.2(像我一样),那么答案就是简单地升级到v2.7。在阅读psycopg2的文章时,有一个针对SSL的小补丁,尽管它看起来并不特别相关 我的设置如下:
- Mac OS X El Capitan 10.11.6
- psycopg2