你如何让PyPy,Django和PostgreSQL一起工作?

Jam*_*s R 90 python django postgresql pypy psycopg2

应该使用什么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做好了准备,遗憾的是.

int*_*tgr 33

psycopg2cffi(2015年更新)

psycopg2cffi是另一个psycopg2兼容的替代品,应该提供PyPy最好的PostgreSQL性能.将此添加到您settings.py的保持兼容:

try:
    import psycopg2
except ImportError:
    # Fall back to psycopg2cffi
    from psycopg2cffi import compat
    compat.register()
Run Code Online (Sandbox Code Playgroud)

psycopg2-ctypes(2012)

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

这是最简单的方法; 要保持与两者兼容,只需在Django中添加此代码settings.py:

try:
    import psycopg2
except ImportError:
    # Fall back to psycopg2-ctypes
    from psycopg2ct import compat
    compat.register()
Run Code Online (Sandbox Code Playgroud)

我在几个版本之前测试了这个; 遗憾的是,根据我的经验,psycopg2-ctypes否定了PyPy提供的小的性能提升.但是YMMV,它取决于你的代码对JIT友好的程度以及你运行Python代码实际花费的时间.也许PyPy从那时起刚刚改进.

我认为psycopg2-ctypes还没有为Windows做好准备

我没有试过这个,但是ctypes与平台无关.AFAICT您只需要确保该libpq.dll库是可加载的(位于PATH环境变量或本地目录中的目录中),它应该像在Linux中一样在Windows上运行.

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

除此以外:

python translate.py -Ojit
Run Code Online (Sandbox Code Playgroud)

可悲的是,这是我的知识结束的地方.我收到错误" BytecodeCorruption: unimplemented opcode, ofs=234, code=203, name=BUILD_LIST_FROM_ARG"


aka*_*ola 16

一些额外的资源:

  • PyPy兼容性信息:DB适配器
  • Python维基上的PostgreSQL页面
  • psycopg2cffi来自Konstantin Lopuhin:
    基于cffi的psycopg2实现PyPy 2.0和更新版本
    (博客文章,GitHub repo,PyPI页面,pypy-dev线程)
    - 这看起来像目前最强的候选者,但我还没有测试过它
  • psycopg2ct作者:Michael van Tellingen:
    基于ctypes实现psycopg2 for PyPy 1.6及更新版本
    (GitHub repo,PyPI页面)
  • Alex Gaynor的pypy-postgresql:
    放弃了psycopg2的RPython端口,实现为PyPy的一个分支(Bitbucket repo)
  • pypq:
    "使用ctypes和libpq.so的Python PostgreSQL DBAPI 2.0兼容驱动程序,与PyPy一起使用"
    (讨论,PyPI页面)
  • bpgsql:
    "Barebones pure-python PostGreSQL客户端.大部分符合DB-API 2.0(PEP 249).包括一个实验性的Django 1.0后端"
    (讨论,网页,谷歌代码页)
  • pg8000:
    "与PostgreSQL数据库引擎兼容的DB-API 2.0兼容Pure-Python接口[...]不依赖于任何外部库(例如编译的python模块或PostgreSQL的libpq库)"
    (网页,GitHub repo),PyPI页面)