我正在尝试使用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
这是我试图解决问题的方法
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
节目
由于您是通过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; }
在您的connect语句中指定给psycopg2.connect()的关键字正在处理该函数,并且错误将作为OperationalError异常返回.
该错误实际上是直接在postgresql-lib中生成的 - 您可能想要检查您正在使用哪个版本,如何构建它,如果可能,请将其升级到支持SSL的版本,或者在启用SSL的情况下从源重建它.
postgresql-docs还声明如果sslmode设置为require,verify-ca或verify-full,则缺少SSL支持将引发错误.请参阅此处以sslmode
供参考.
在Postgres的-网站列出了几种方法来安装从二进制包Postgres的,所以你可以选择一个适合您的需求.我不熟悉OSX,所以我没有推荐什么是最好的.
这个问题也可能有所帮助.
您还需要重新安装psycopg2模块,确保在重建时使用新安装的lib.请参阅链接的问题(简而言之,您需要pg_config
在运行时将新安装中包含的路径放置到$ PATH pip install psycopg2
).
我有同样的错误,原来是因为我使用的是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
然后当你运行时,conda list
你会
在最右边的列中看到安装的psycopg2 .之后,我刚刚重启Python,一切正常.
您收到的错误是由Postgres本身的问题引起的,而不是psycopg2
.
psycopg2.OperationalError: sslmode value "require" invalid when SSL support is not compiled in
以上表示psycopg2
构建的Postgres版本没有编译的SSL支持.当您尝试连接到正在运行的Posgres服务器时,ssl=require
会抛出此错误.
你没有提到你如何安装Postgres,但由于你使用Homebrew做其他事情,我建议你也以同样的方式安装Postgres:
$ brew update $ brew install postgresql
postgresql的公式显示它依赖于标志集openssl
并进行编译--with-openssl
.它还将安装必要的libpq
标头.您可能需要psycopg2
在此步骤之后重新安装,以确保它获取正确的库/版本.
有趣的是,针对conda列出了一个错误,列出了psycopg2
在系统上安装了带有Homebrew postgres的系统的conda版本时报告的相同错误,表明缺少SSL库也可以触发此错误.
我建议在重新安装之前卸载任何现有的Postgres版本(包括通过Homebrew安装的任何版本),以最大限度地降低使用错误的风险.