我正在使用Macbook
当连接localhost db(在Mac上为PostgreSQL)时,Psycopg2可以很好地工作。当我尝试在Windows10上连接PostgreSQL数据库时,引发了错误。
以下代码是我用于连接的内容,主机只是Windows10的IP
db= psycopg2.connect(database='dbname',user='username',password="secret",host="192.168.3.9",port="5432")
错误:
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机器,但没有运气使其工作。 但是,使用Node.JS module pg
时,我可以在Windows上连接PostgreSQL。答案 0 :(得分:5)
向连接字符串添加?gssencmode = disable 对我有用:
import pyodbc
from sqlalchemy import create_engine
engine = create_engine(f'postgresql://{user}:{password}@localhost:5432/database_name?gssencmode=disable')
答案 1 :(得分:4)
使用Laravel和Postgres时遇到类似的错误。通过将其放在我的.env文件中来解决此问题:PGGSSENCMODE=disable
答案 2 :(得分:3)
1234.5679
是客户端发送的用于请求SSL加密数据库连接的特殊代码,自1999年commit e0e7daef6da起,对PostgreSQL的支持就一直存在。但是您的PostgreSQL不能这么老,因为在2003年之前未添加对协议版本3.0的支持。
实际上,通过研究src/backend/postmaster/postmaster.c
并阅读邮件列表,这是PostgreSQL服务器上的错误:
必须将客户端配置为尝试GSS身份验证,并且当服务器拒绝时,它希望协商SSL连接,但是服务器目前不希望这样做。因此是错误。
请参阅讨论here。
要解决此问题,请在客户端上禁用GSS身份验证或SSL协商。
答案 3 :(得分:1)
为了使SSL连接正常工作并使用证书,您可以禁用GSS连接模式,以避免客户端尝试与GSS连接并直接尝试进行SSL连接(Postgres版本12 <12.3,我没有这样的问题在版本11上进行测试)。
下面带有verify-ca选项的示例,提供证书和密钥的文件名(来自GCP Cloud SQL的示例名称,发布时运行Postgres 12.1)。
from sqlalchemy import create_engine
db_user = 'user'
db_pwd = 'secret'
db_host = 'hostname'
db_port = '5432'
db_name = 'test'
cnn = f'postgresql://{db_user}:{db_pwd}@{db_host}:{db_port}/{db_name}'
ssl_args = {
'gssencmode': 'disable',
'sslmode': 'verify-ca',
'sslrootcert': 'server-ca.pem',
'sslcert': 'client-cert.pem',
'sslkey': 'client-key.pem',
}
engine = create_engine(cnn, connect_args=ssl_args)
例如,此引擎可以与熊猫一起使用:
df.to_sql('my_table', con=engine)
答案 4 :(得分:1)
如果您通过 conda 命令安装了此 Psycopg2 模块,则卸载该模块并使用 pip 命令进行安装。
命令: pip 安装 Psycopg2
以上命令可能会解决您的问题。我通过这一步解决了
答案 5 :(得分:0)
使用PostgresSQL 13.0,我遇到了同样的问题,显示了错误消息:
unsupported frontend protocol 255.255: server supports 2.0
unsupported frontend protocol 0.0: server supports 2.0 to
根据该站点,postgresql.org处理SSL / GSS协议协商问题。在Postgres 12.0版中应该已经解决了这个问题
我能够按照这些网站中包含的准则解决该问题: highgo.ca
在postgres终端中,我执行了以下命令,设置了环境变量gssencmode = disable,问题得以解决:
psql -h localhost -U postgres -d "dbname=belez gssencmode=disable";