如何在pypy3官方Docker镜像中成功安装psycopg2数据库驱动?
PyPy3镜像安装psycopg2失败解决方案
问题根因
PyDateTime_TimeZone_UTC未声明的编译报错,是因为2.9及以上版本的psycopg2引入了CPython专属的datetime时区底层API,PyPy3未对这部分私有API做兼容,导致源码编译直接失败。
可行解决方案
方案1:使用预编译版本psycopg2-binary(最便捷)
psycopg2-binary是官方提供的预编译发行版,无需本地编译,原生兼容PyPy3环境,修改依赖安装命令即可:
# 替换原来的psycopg2安装命令 pypy3 -m pip install psycopg2-binary
如果使用requirements.txt,直接把psycopg2替换为psycopg2-binary即可,SQLAlchemy无需做任何适配修改。
方案2:安装兼容PyPy的低版本psycopg2
如果必须使用psycopg2而非binary版本,可以指定安装2.8.x分支的最后稳定版,该版本未引入不兼容的API调用:
pypy3 -m pip install psycopg2<2.9
方案3:升级到新一代psycopg3(推荐)
psycopg3(包名为psycopg)是psycopg的新一代版本,原生设计支持PyPy,性能比psycopg2更高,SQLAlchemy 1.4及以上版本已原生支持psycopg3:
pypy3 -m pip install psycopg[binary]
优化后的Dockerfile示例
原Dockerfile存在冗余依赖、重复安装工具、未清理缓存的问题,优化后如下:
FROM pypy:3 WORKDIR / COPY . . # 合并apt命令,清理缓存减小镜像体积,无需安装完整postgresql服务、无需CPython的python3-dev RUN apt-get update && \ apt-get install -y --no-install-recommends libpq-dev gcc && \ rm -rf /var/lib/apt/lists/* RUN pypy3 -m pip install --upgrade pip # 这里根据你选的方案调整安装命令,以方案1为例 RUN pypy3 -m pip install psycopg2-binary RUN pypy3 -m pip install -r requirements.txt ENV PYTHONPATH "${PYTHONPATH}:/src" ENTRYPOINT ["pypy3", "xxx.py"]
内容的提问来源于stack exchange,提问作者user3761555
相关产品推荐
相关产品推荐

