Python psycopg2.OperationalError:致命:不支持的前端协议1234.5679:服务器支持2.0到3.0
我在用Macbook 连接本地主机数据库(Mac上的PostgreSQL)时,Psycopg2工作良好。当我尝试在Windows10上连接PostgreSQL db时出现错误 下面的代码是我的连接代码,主机就是windows10的IP 错误: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
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";