psycopg2 连接给出操作错误不受支持的前端协议

psycopg2 connect gives operational error unsupported frontend protocol

我正在尝试从 python 3.8.2 Windows 10 上的 anaconda python 3.8.2 连接到 postgres 12.2 数据库。我正在使用安装了以下软件包的 conda 环境:

asgiref==3.2.7
certifi==2020.4.5.1
Django==3.0.4
django-crispy-forms==1.8.1
Jinja2==2.11.1
MarkupSafe==1.1.1
psycopg2==2.8.5
pytz==2019.3
sqlparse==0.3.1
wincertstore==0.2

我已经创建了一个数据库,我可以使用 psql 和 pgAdmin 进行连接。在 python 提示符下,我可以导入 psycopg2,但连接到数据库时出现错误:

>>> import psycopg2
>>> c = psycopg2.connect("host='localhost' dbname='mydb' user='myuser' password='secret'")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "J:\Programs\Anaconda3\envs\myenv\lib\site-packages\psycopg2\__init__.py", line 127, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: FATAL:  unsupported frontend protocol 1234.5679: server supports 2.0 to 3.0

这是一个已知错误,客户端认为它可以使用 GSS 加密,但后来发现它不能(服务器不支持它,或者不喜欢凭据),因此尝试重新协商 ssl 加密。

您通常必须竭尽全力让客户端认为它可以使用 GSS 加密(Mac 除外,其中一些有问题的 mac 库让它总是认为它可以)。您是否有意在您的 Anaconda 环境中设置 GSS/kerberos?

按照@jjanes 的建议和相关回答 我禁用了 ssl 和 gss:

>>> import psycopg2
>>> c = psycopg2.connect("host='localhost' dbname='mydb' user='myuser' password='secret' sslmode='disable' gssencmode='disable'")

这有效,但请注意,您不需要同时禁用 sslmodegssencmode,单独禁用其中一个也有效。

Django用户只需在settings.py中添加相关选项即可:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mydb',
        'USER': 'myuser',
        'PASSWORD': 'secret',
        'HOST': 'localhost',
        'PORT': '5432',
        'OPTIONS': {'sslmode':'disable'},
    }
}