如何让PyPy、Django和PostgreSQL协同工作?

95
什么fork或者包的组合可以让PyPy、Django和PostgreSQL协同工作?
我知道PyPy和Django可以很好地协同工作,但是我不确定PyPy和PostgreSQL是否可以。我看到Alex Gaynor制作了一个叫做pypy-postgresql的PyPy分支。我也知道有些人在使用psycopg2-ctypes
这些分支之间有区别吗?还是我们应该使用稳定的1.9 PyPy并使用psycopg2-ctypes?使用ctypes选项可能会影响性能,请参见下面的评论。
此外,有没有人在使用PyPy和pyscopg2时遇到过问题?如果出现问题,似乎很容易回退到CPython,但主要是我想寻找程序员可以提前做的准备工作。

我查看了一下,似乎psycopg2不能与PyPy原生兼容。虽然有些人使用psycopg2-ctypes,但在pypy-dev上进行了讨论。我在Windows上工作,不幸的是,我认为psycopg2-ctypes还没有准备好支持Windows。


8
有一个很好的谈话是由Alex在Djangocon Europe 2011上进行的,他在其中也谈到了Postgres的问题: http://blip.tv/djangocon-europe-2011/monday-1400-alex-gaynor-good-5343953 - Bernhard Vallant
3
顺便提一下,从PyPy调用C代码仍然比使用纯Python模块要慢得多。因此,您可能无法通过PyPy运行Django + psycopg2获得任何好处。您可以使用RPython重写psycopg2,或者使用CPython并使用Cython优化应用程序的关键部分。 - Vladimir Protasov
此外:https://bitbucket.org/alex_gaynor/pypy-postgresql(有点旧了...) - jperelli
2
我周围有些人推荐使用psycopg2ct,但是没有在django中使用过...或许有帮助... - Dingo
你的操作系统是什么,发行版是哪个,版本号是多少? - pylover
DjangoconEU的视频于2013年11月7日被blip.tv删除。现在可以在pyvideo.org上找到这个讲座。http://pyvideo.org/video/2486/0_django-and-pypy-performant-is-a-wordm4v - umeboshi
2个回答

38

psycopg2cffi (更新于2015年)

psycopg2cffi 是另一个与 psycopg2 兼容的替代方案,应该可以在 PyPy 中提供最佳的 PostgreSQL 性能。将以下内容添加到您的 settings.py 文件中,以保持兼容性:

try:
    import psycopg2
except ImportError:
    # Fall back to psycopg2cffi
    from psycopg2cffi import compat
    compat.register()

psycopg2-ctypes (2012)

我也知道有些人正在使用psycopg2-ctypes。

这是最简单的方法;如果要与两者兼容,请在Django的 settings.py 中添加以下代码:

try:
    import psycopg2
except ImportError:
    # Fall back to psycopg2-ctypes
    from psycopg2ct import compat
    compat.register()

我在几个版本之前测试过这个功能;不幸的是,根据我的经验,psycopg2-ctypes抵消了PyPy所带来的小幅性能提升。但你的情况可能不同,这取决于你的代码是否适合JIT和你实际运行Python代码的时间比例。也可能自那时以来,PyPy已经有所改进。

而且,我认为psycopg2-ctypes还没有准备好用于Windows

我没有尝试过这个,但ctypes是跨平台的。据我所知,您只需要确保libpq.dll库可加载(位于PATH环境变量或本地目录中的目录),它应该在Windows上正常工作,就像在Linux上一样。

pypy-postgresql

我看到Alex Gaynor创建了一个名为pypy-postgresql的PyPy分支。

我认为从长远来看这不是一个好选择。该分支已经超过一年没有更新了,我的构建尝试失败了。而且,在解释器中硬编码PostgreSQL驱动程序似乎是错误的做法。

我相信现在没有pypy-postgresql的二进制文件可供使用,因此,如果要使用它,您需要自己构建整个PyPy分支。这不是一个简单的任务:需要几十分钟和至少4 GB内存的机器。(官方说明:http://pypy.org/download.html#building-from-source

要构建,首先需要源代码。如果您已经安装了Mercurial,可以直接使用hg clone https://bitbucket.org/alex_gaynor/pypy-postgresql。否则,您可以下载自动化的“tip” zip文件:https://bitbucket.org/alex_gaynor/pypy-postgresql/get/tip.zip

打开命令行,进入解压后的目录,然后进入pypy/translator/goal目录。

如果您已经安装了PyPy,建议使用它来构建:

pypy translate.py -Ojit

否则:

python translate.py -Ojit

不幸的是这就是我的知识尽头。我遇到了错误 "BytecodeCorruption: unimplemented opcode, ofs=234, code=203, name=BUILD_LIST_FROM_ARG"


你能否提供一些信息,有关在不需要从源代码编译pypy的情况下,如何让pypy-pyscopg2与pypy兼容? - James R
1
我更新了答案,并详细说明了我的进展。不幸的是,构建过程中出现了错误而中止。我记得上次花了整个下午试图构建它,但最终失败了。 - intgr
psycopg2cffi在Windows上无法通过pip安装! - user3761555
但是这似乎有效:https://pypi.org/project/py-postgresql/ - user3761555

16

一些额外的资源:

  • PyPy兼容性信息:DB适配器
  • Python维基上的PostgreSQL页面
  • psycopg2cffi由Konstantin Lopuhin开发:
    基于cffi的Psycopg2实现,适用于PyPy 2.0及更高版本
    (博客文章, GitHub仓库, PyPI页面, pypy-dev线程)
    - 这似乎是目前最强的选择,但我还没有测试过它
  • psycopg2ct由Michael van Tellingen开发:
    基于ctypes的Psycopg2实现,适用于PyPy 1.6及更高版本
    (GitHub仓库, PyPI页面)
  • pypy-postgresql由Alex Gaynor开发:
    作为PyPy分支实现的被弃用的Psycopg2的RPython端口 (Bitbucket仓库)
  • pypq:
    "使用ctypes和libpq.so编写的Python PostgreSQL DBAPI 2.0兼容驱动程序,适用于PyPy"
    (讨论, PyPI页面)
  • bpgsql:
    "bpgsql是一个基于Python的轻量级PostgreSQL客户端,主要实现了DB-API 2.0 (PEP 249)规范,并包含一个实验性的Django 1.0后端。"
    (讨论, 网页, Google Code页面)
  • pg8000:
    "pg8000是一个DB-API 2.0兼容的纯Python接口,用于连接PostgreSQL数据库引擎[...]不依赖于任何外部库(如已编译的Python模块或PostgreSQL的libpq库)"
    (网页, GitHub仓库, PyPI页面)

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