我正在尝试使用psycopg2和sslmode ='required'参数连接到我的postgres数据库;但是,我收到以下错误
psycopg2.OperationalError: sslmode value "require" invalid when SSL support is not compiled in
关于我的系统的几个细节
以下是我尝试解决问题的方法
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
完成所有这些后,异常仍然发生。我通过#!/usr/bin/env python
运行此python脚本不确定它是否重要,但这是一个与which python
显示的目录不同的目录
答案 0 :(得分: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;
}
正在对该函数处理在连接语句中指定给psycopg2.connect()的关键字,并将错误作为OperationalError异常返回。
错误实际上是直接在postgresql-lib中生成的 - 您可能想要检查您正在使用的版本,它是如何构建的,如果可能的话,将其升级到支持SSL的版本或从源代码重建它已启用SSL。
postgresql-docs还声明如果sslmode设置为 require , verify-ca 或 verify-full,则缺少SSL支持会引发错误即可。请参阅sslmode
下的here以供参考。
postgres-website列出了从二进制包安装postgres的几种方法,因此您可以选择一种适合您需要的方法。我对OSX不熟悉,所以我没有推荐最好的。
This问题也可能有所帮助。
您还需要重新安装psycopg2模块,确保在重建时使用新安装的lib。请参阅链接的问题(简而言之,在运行pg_config
时,您需要将新安装中包含的pip install psycopg2
路径放到$ PATH。
答案 1 :(得分:6)
我有同样的错误,原来是因为我使用的是anaconda版本的psycopg2。为了解决这个问题,我调整了VictorF's solution from here并运行:
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
时,您会在最右侧的列中看到与<pip>
一起安装的psycopg2。之后,我刚刚重启了Python,一切正常。
答案 2 :(得分:5)
您收到的错误是由Postgres本身的问题引起的,而不是psycopg2
引起的。
psycopg2.OperationalError: sslmode value "require" invalid when SSL support is not compiled in
以上表明构建psycopg2
的Postgres版本没有编译的SSL支持。当您尝试使用ssl=require
连接到正在运行的Posgres服务器时,它会抛出此错误。< / p>
您没有提及如何安装Postgres,但由于您使用Homebrew进行其他操作,我建议您同样安装Postgres:
$ brew update
$ brew install postgresql
formula for postgresql表明它依赖于openssl
并使用--with-openssl
标志集进行编译。它还将安装必要的libpq
标头。您可能需要在此步骤之后重新安装psycopg2
,以确保它获取正确的库/版本。
有趣的是,有一个bug listed against conda列出了您在系统上安装了psycopg2
的conda版本时报告的相同错误 - 在系统上安装了Homebrew postgres - 没有,建议丢失SSL库也可以触发这个。
我建议在重新安装之前卸载任何现有的Postgres版本(包括通过Homebrew安装的任何版本),以尽量减少使用错误的版本的风险。
答案 3 :(得分:3)
正如其他人所说,错误信息似乎来自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
您还希望创建一个证书(这也可能是错误发生的地方),如果这是一个公众面临的最轻微或自签名的话,也可以来自注册商。对于开发/测试环境。
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
导航到您的config目录,默认为:〜/ Library / Application \ Support / Postgres93 / var
启用ssl支持:
vim postgresql.conf
# change this:
# ssl = on
# to this:
ssl = on
重新启动应用,然后使用psql "sslmode=require"
如果可行则通过Python代码尝试。如果它适用于上面的代码,但不适用于Python,那么它肯定是一个需要解决的Python代码问题。
答案 4 :(得分:1)
我无法发表评论:
添加到Brideau的答案,这对我改变我的Postgres版本后只对我有用。
brew uninstall postgres
brew update
brew install postgres --with-openssl
然后运行Brideau提供的代码,它应该工作。
答案 5 :(得分:0)
如果你正在使用psycopg2的v2.6.1或v2.6.2(和我一样),答案是对v2.7的简单升级。阅读psycopg2的release notes,对SSL有一个小修复,尽管它看起来并不特别相关。
我的设置如下:
运行pip uninstall psycopg2
后跟pip install psycopg2
已解决的问题。
答案 6 :(得分:-4)