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

The*_*ror 13 python postgresql psycopg2

我正在使用 Macbook

Psycopg2 在连接 localhost db(Mac 上的 PostgreSQL)时运行良好。当我尝试在 Windows10 上连接 PostgreSQL 数据库时出现错误。

以下代码是我用于连接的代码,主机只是windows10的IP

db= psycopg2.connect(database='dbname',user='username',password="secret",host="192.168.3.9",port="5432")
Run Code Online (Sandbox Code Playgroud)

错误:

  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
Run Code Online (Sandbox Code Playgroud)

这是因为系统兼容性还是其他原因?我试过其他 Windows 机器,但没有运气让它工作。但是,当我使用Node.JS 模块 pg 时,我能够在 Windows 上连接 PostgreSQL

Lau*_*lbe 19

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

其实,通过研究src/backend/postmaster/postmaster.c和阅读邮件列表,这是PostgreSQL服务器上的一个错误:

客户端必须配置为尝试 GSS 身份验证,当服务器拒绝时,它想要协商 SSL 连接,但此时服务器并不期望;因此错误。

请参阅此处的讨论。该错误已在 12.3 版中修复。

解决方法是在客户端上禁用 GSS 身份验证或 SSL 协商。

在 psycopg2 中,禁用 SSL 是通过sslmode="disable"在连接字符串中使用来完成的,而禁用 GSS 是使用gssencmode="disable". 有关详细信息,请参阅文档

  • 不确定它是否有帮助,但我使用 docker 的“12.1-alpine”图像遇到了同样的错误,使用“12.1”图像时该错误不会出现。 (2认同)
  • @LaurenzAlbe 不,这两个测试的代码完全相同,我唯一更改的是我的 *docker-compose* 文件中的“FROM”指令。在这两种情况下,我都会将卷“/var/lib/postgresql/data”安装到本地主机。当我从主机(也运行版本“12.1”)连接到数据库时,错误消息显示数据库是由“12.1-alpine”docker 容器创建的,而不是由“12.1”容器创建的。 (2认同)

小智 5

使用 Laravel 和 Postgres 时遇到类似的错误。通过将其放入我的 .env 文件中解决了这个问题:PGGSSENCMODE=disable

  • 每当您回答问题时,请毫不犹豫地澄清您提出的解决方案的作用、您的想法来自何处以及可能存在的缺点。此外,当服务器明确提供某些支持时禁用加密也不是一个好主意,即使对于本地数据库也是如此。有一天,人们可能会将数据库移动到另一台主机,却没有意识到,他只是把事情搞砸了。 (2认同)

Jul*_*lio 5

?gssencmode=disable添加到连接字符串对我有用

import pyodbc
from sqlalchemy import create_engine

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