Python psycopg2.OperationalError:致命:不支持的前端协议1234.5679:服务器支持2.0到3.0

Python psycopg2.OperationalError:致命:不支持的前端协议1234.5679:服务器支持2.0到3.0,python,postgresql,psycopg2,Python,Postgresql,Psycopg2,我在用Macbook 连接本地主机数据库(Mac上的PostgreSQL)时,Psycopg2工作良好。当我尝试在Windows10上连接PostgreSQL db时出现错误 下面的代码是我的连接代码,主机就是windows10的IP 错误: File "path/to/psycopg2/__init__.py", line 126, in connect conn = _connect(dsn, connection_factory=connection_factory, **k

我在用Macbook

连接本地主机数据库(Mac上的PostgreSQL)时,Psycopg2工作良好。当我尝试在Windows10上连接PostgreSQL db时出现错误

下面的代码是我的连接代码,主机就是windows10的IP

错误:

  File "path/to/psycopg2/__init__.py", line 126, 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
这是因为系统兼容性还是其他原因?我试过其他的Windows机器,但没能成功。
然而,我能够在windows上连接PostgreSQL,而我使用的是

1234.5679
是客户端发送的请求SSL加密数据库连接的特殊代码,自1999年以来,PostgreSQL一直支持这一点。但是您的PostgreSQL不能那么旧,因为2003年之前没有添加对协议版本3.0的支持

实际上,通过研究
src/backend/postmaster/postmaster.c
和阅读邮件列表,这是PostgreSQL server上的一个bug:

客户机必须配置为尝试GSS身份验证,当服务器拒绝时,它希望协商SSL连接,但服务器此时不希望这样;因此出现了错误

见讨论。该缺陷已在12.3版中修复

作为一种解决方法,请在客户端上禁用GSS身份验证或SSL协商


在psycopg2中,通过在连接字符串中使用
sslmode=“disable”
禁用SSL,通过
gssencmode=“disable”
禁用GSS。有关详细信息,请参阅。

在使用Laravel和Postgres时遇到类似错误。通过将此问题放在.env文件中解决:
PGGSSENCMODE=disable

?gssencmode=disable添加到对我有效的连接字符串中:

import pyodbc
from sqlalchemy import create_engine

engine = create_engine(f'postgresql://{user}:{password}@localhost:5432/database_name?gssencmode=disable')

为了使SSL连接工作并使用证书,您可以禁用GSS连接模式,以避免客户端尝试与GSS连接,并直接尝试SSL连接(Postgres版本12<12.3,我在版本11上的测试中没有此类问题)

下面是一个带有验证ca选项的示例,提供证书和密钥的文件名(来自GCP Cloud SQL的示例名,发布时运行Postgres 12.1)

该发动机可与熊猫一起使用,例如:

   df.to_sql('my_table', con=engine)

使用PostgresSQL 13.0时,我遇到了相同的问题,显示了错误消息:

 unsupported frontend protocol 255.255: server supports 2.0
 unsupported frontend protocol 0.0: server supports 2.0 to
根据这个站点,它处理SSL/GSS协议协商问题。这应该已经在Postgres 12.0版中解决了

我能够按照这些网站中包含的指导原则解决这个问题:

在postgres终端中,我执行了下面的命令,设置环境变量gssencmode=disable,问题得到了解决:

  psql -h localhost -U postgres -d "dbname=belez gssencmode=disable";

如果您通过conda命令安装了此Psycopg2模块,请卸载该模块并使用pip命令安装

命令: pip安装Psycopg2


上述命令可能会解决您的问题。我通过这一步解决了这个问题

很抱歉,我的手指太轻率了,这是一个PostgreSQL server错误。不确定它是否有用,但我在使用docker的
12.1-alpine
图像时遇到了相同的错误,当使用
12.1
图像时,该错误不会出现。@cGlace这一定是因为您正在做一些不同的事情。目前这是一个活bug,建议的修复尚未应用于代码。@LaurenzAlbe否,这两个测试的代码完全相同,我唯一更改的是docker compose文件中的
FROM
指令。在这两种情况下,我都将卷
/var/lib/postgresql/data
装载到本地主机。当我从主机连接到数据库(也运行版本
12.1
)时,错误消息显示数据库是何时由
12.1-alpine
docker容器创建的,而不是何时由
12.1
容器创建的。@Long\n我添加了如何在客户端连接中禁用SSL和GSS的说明。该数据库称为“Postgres”,而不是“Postgre”。无论何时回答问题,请毫不犹豫地澄清您提出的解决方案的作用、您的想法来源以及可能存在的缺点。此外,当服务器明确提供一些支持时,禁用加密也不是一个好主意,即使对于本地数据库也是如此。有一天,人们可能会将数据库移动到另一台主机,却没有意识到,他只是把事情搞砸了。
 unsupported frontend protocol 255.255: server supports 2.0
 unsupported frontend protocol 0.0: server supports 2.0 to
  psql -h localhost -U postgres -d "dbname=belez gssencmode=disable";