web-dev-qa-db-fra.com

Comment faire fonctionner ensemble PyPy, Django et PostgreSQL?

Quelle fourchette ou combinaison de packages doit-on utiliser pour faire PyPy, Django et PostgreSQL jouent Nice ensemble?

Je sais que PyPy et Django jouent Nice ensemble, mais je suis moins sûr de PyPy et PostgreSQL. Je vois bien qu'Alex Gaynor a créé un fork de PyPy appelé pypy-postgresql . Je sais aussi que certaines personnes utilisent psycopg2-ctypes .

Y a-t-il une différence entre ces fourches? Ou devrions-nous utiliser le PyPy 1.9 stable et utiliser des psycopg2-ctypes? L'utilisation des options ctypes pourrait nuire aux performances, voir le commentaire ci-dessous.

En outre, quelqu'un a-t-il rencontré des pièges avec l'utilisation de PyPy avec pyscopg2? Il semble assez facile de se replier sur CPython si quelque chose ne fonctionne pas correctement, mais surtout je cherche des choses qu'un programmeur peut faire à l'avance pour se préparer.

J'ai regardé autour de moi, il ne semble pas que psycopg2 fonctionne nativement avec PyPy. Bien que psycopg2-ctypes semble fonctionner pour certaines personnes, il y a eu une discussion sur pypy-dev . Je travaille sur Windows, et je ne pense pas que psycopg2-ctypes soit encore prêt pour Windows, malheureusement.

90
James R

psycopg2cffi (mise à jour 2015)

psycopg2cffi est encore un autre remplacement compatible psycopg2 et devrait fournir les meilleures performances PostgreSQL avec PyPy. Ajoutez ceci à votre settings.py pour rester compatible avec les deux:

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

psycopg2-ctypes (2012)

Je sais également que certaines personnes utilisent des psycopg2-ctypes.

C'est le moyen le plus simple; pour rester compatible avec les deux, ajoutez simplement ce code dans votre Django settings.py:

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

J'ai testé cela il y a quelques versions; malheureusement dans mon expérience, psycopg2-ctypes annule les petits gains de performances offerts par PyPy. Mais YMMV, cela dépend de la façon dont votre code est compatible avec JIT en général et de la fraction de temps que vous passez réellement à exécuter Python code. Et peut-être que PyPy vient de s'améliorer depuis lors.

et je ne pense pas que psycopg2-ctypes soit encore prêt pour Windows

Je n'ai pas essayé cela, mais ctypes est indépendant de la plateforme. AFAICT il vous suffit de vous assurer que le libpq.dll la bibliothèque est chargeable (située dans un répertoire de votre variable d'environnement PATH ou répertoire local) et devrait fonctionner sous Windows comme sous Linux.

pypy-postgresql

Je vois bien qu'Alex Gaynor a fait une fourchette de PyPy appelée pypy-postgresql.

Je ne pense pas que ce soit un bon choix à long terme. La branche n'a pas été mise à jour depuis plus d'un an et mes tentatives pour la construire ont échoué. Et il semble mal de coder en dur un pilote PostgreSQL dans l'interpréteur de toute façon.

Je pense qu'il n'y a pas non plus de binaires de pypy-postgresql, donc si vous voulez l'utiliser, vous devrez construire vous-même la branche PyPy. Pas pour les faibles de cœur: cela prend des dizaines de minutes et une machine avec au moins 4 Go de mémoire. (Instructions officielles: http://pypy.org/download.html#building-from-source )

Pour construire, vous avez d'abord besoin de la source. Si Mercurial est installé, vous pouvez simplement hg clone https://bitbucket.org/alex_gaynor/pypy-postgresql. Sinon, vous pouvez télécharger le fichier Zip "tip" automagique: https://bitbucket.org/alex_gaynor/pypy-postgresql/get/tip.Zip

Ouvrez une ligne de commande, accédez au répertoire décompressé, puis à l'intérieur de pypy/translator/goal

Si vous avez installé PyPy, il est recommandé de l'utiliser pour construire:

pypy translate.py -Ojit

Autrement:

python translate.py -Ojit

Malheureusement, c'est là que ma connaissance se termine. J'obtiens l'erreur "BytecodeCorruption: unimplemented opcode, ofs=234, code=203, name=BUILD_LIST_FROM_ARG "

33
intgr

Quelques ressources supplémentaires:

  • Informations de compatibilité PyPy: adaptateurs DB
  • page PostgreSQL sur le Python
  • psycopg2cffi par Konstantin Lopuhin:
    implémentation basée sur cffi de psycopg2 pour PyPy 2.0 et plus récent
    ( article de blog , dépôt GitHub , page PyPI , fil pypy-dev )
    - cela ressemble au candidat le plus fort actuellement, mais je ne l'ai pas encore testé
  • psycopg2ct par Michael van Tellingen:
    implémentation basée sur ctypes de psycopg2 pour PyPy 1.6 et plus récent
    ( dépôt GitHub , page PyPI )
  • pypy-postgresql par Alex Gaynor:
    port RPython abandonné de psycopg2 implémenté en tant que fork de PyPy ( Bitbucket repo )
  • pypq :
    "Pilote compatible Python PostgreSQL DBAPI 2.0 utilisant ctypes et libpq.so, fonctionne avec PyPy"
    ( discussion , page PyPI )
  • bpgsql :
    "Client PostGreSQL pur-python nu. Principalement compatible DB-API 2.0 (PEP 249). Comprend un backend expérimental Django 1.0 backend"
    ( discussion , page Web , page de code Google )
  • pg8000 :
    "une interface Pure-Python compatible DB-API 2.0 avec le moteur de base de données PostgreSQL [...] ne repose sur aucune bibliothèque externe (telle qu'un module compilé python, ou la bibliothèque libpq de PostgreSQL) "
    ( page Web , dépôt GitHub , page PyPI )
16
akaihola