Python psycopg2 SCRAM身份验证

8

我正在尝试运行使用psycopg2-binary==2.9.1的Python应用程序,但是我遇到了这个错误:

psycopg2.OperationalError: SCRAM authentication requires libpq version 10 or above

当我检查已安装的libpq版本时,它显示我有12.8:
sudo dpkg -l | grep libpq
ii  libpq5:arm64                       12.8-0ubuntu0.20.04.1             arm64        PostgreSQL C client library

我搜索了一下,看到一些建议关闭scram身份验证,因此我在pg_hba.conf和postgresql.conf中将身份验证更改为md5,然后重新加载配置文件(并重新启动了我的数据库)。

我仍然遇到这个问题。有人知道是什么问题吗?提前感谢。


你是如何编译psycopg2的?编译过程中使用了哪个版本的libpq,还是另外一个版本? - Jeremy
你可以使用strace命令来查看它实际打开了哪个libpq文件(如果有的话)。 - jjanes
@jjanes 我试了一下,我怀疑 psycopg2-binary 本身有 libpq 库(我正在使用 pyinstaller):venv$ find . | grep libpq ./lib/python3.8/site-packages/psycopg2_binary.libs/libpq-c98caf99.so.5.9 - David Co
很奇怪。对我来说它有'libpq-6f24e430.so.5.13'。如果你使用pip时加上-U参数会怎样?或者尝试卸载并重新安装? - jjanes
我在另一台服务器上也看到了同样的问题: ./venv/lib/python3.7/site-packages/psycopg2_binary.libs/libpq-6f24e430.so.5.13我想知道这是否是Ubuntu 20.0的错误分发。 - David Co
5个回答

12

我正在使用苹果芯片(M1 Pro)。

在我的环境中(docker 上的 python debian 镜像),解决方案是升级 libpq 并安装构建工具,然后从源代码构建 psycopg2-binary。

ubuntu 示例代码:

sudo apt update -y && sudo apt install -y build-essential libpq-dev
pip install psycopg2-binary --no-binary psycopg2-binary

5
为什么不直接使用 pip install psycopg2 呢?我相信这是该软件包的无二进制版本。 - thorfi

5

我在我的arm64构建中遇到了同样的问题。当我基于Python3 (Debian)构建Docker容器时,如果我为arm64构建,则会安装libpq版本9。

WARNING: The requested image's platform (linux/arm64) does not match the detected host platform (linux/amd64) and no specific platform was requested
Python 3.10.0 (default, Nov 18 2021, 00:02:14) [GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import psycopg2 
>>> print(psycopg2.__libpq_version__)
90623
>>> print(psycopg2.extensions.libpq_version())
90623
>>> 

但是如果我在一台 amd64 CPU 上构建完全相同的 Dockerfile,我安装了不同版本的软件。

Python 3.10.0 (default, Nov 17 2021, 15:26:39) [GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import psycopg2
>>> print(psycopg2.__libpq_version__)
130003
>>> print(psycopg2.extensions.libpq_version())
130003

我也尝试使用 python:3-alpine 适用于arm64,结果得到了更好的结果。

WARNING: The requested image's platform (linux/arm64) does not match the detected host platform (linux/amd64) and no specific platform was requested
/src # python
Python 3.10.0 (default, Nov 30 2021, 00:28:27) [GCC 10.3.1 20211027] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import psycopg2
>>> print(psycopg2.__libpq_version__)
140001
>>> print(psycopg2.extensions.libpq_version())
140001
>>> 

我猜问题出在Debian/Ubuntu使用的存储库上。 也许你应该向Debian和Ubuntu开启一个工单,要求更新arm64架构下的PostgreSQL客户端包。


4

2
你说得对,对我也有效! - Diogo Rosa

0

你的机器上必须有第二份 libpq 的副本,而 psycopg 正在使用该副本。请确定该文件并将其删除或升级。可能需要更新 psycopg。


1
我查看了我正在使用的Python包psycopg-binary的版本。出于未知原因,版本2.9.1中包含了旧版的libpq。这是针对Ubuntu 20.0 arm64的。 - David Co

0
如果你正在使用Docker部署你的应用程序,这个方法对我有效。
# FROM pypy:3.6-7.3.3-slim
FROM python:3.10
WORKDIR /usr/src/test_repo

    
COPY requirements.txt requirements.txt
RUN pip install --upgrade pip && pip install -r requirements.txt
RUN apt-get autoremove -y

RUN apt-get install -y libpq-dev gcc

RUN pip install psycopg2-binary --no-binary psycopg2-binary

COPY . .
EXPOSE 5001
ENTRYPOINT ["flask","run","--host=0.0.0.0","--port=5001"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接