Como você faz com que PyPy, Django e PostgreSQL funcionem juntos?

90

Que fork, ou combinação de pacotes deve ser usado para fazer PyPy, Django e PostgreSQL funcionarem bem juntos?

Eu sei que PyPy e Django jogam bem juntos, mas estou menos certo sobre PyPy e PostgreSQL. Vejo que Alex Gaynor fez um fork do PyPy chamado pypy-postgresql . Também sei que algumas pessoas estão usando psycopg2-ctypes .

Existe alguma diferença entre esses garfos? Ou devemos usar o 1.9 PyPy estável e usar psycopg2-ctypes? Usar as opções de ctypes pode prejudicar o desempenho, consulte o comentário abaixo.

Além disso, alguém já experimentou alguma armadilha ao usar PyPy com pyscopg2? Parece fácil recorrer ao CPython se algo não está funcionando direito, mas principalmente estou procurando coisas que um programador possa fazer antes do tempo para se preparar.

Eu olhei em volta, não parece que psycopg2 funcione nativamente com PyPy. Embora, psycopg2-ctypes pareça estar funcionando para algumas pessoas, houve uma discussão sobre pypy-dev . Eu trabalho no Windows e não acho que psycopg2-ctypes esteja pronto para o Windows ainda, infelizmente.

James R
fonte
8
Há uma boa palestra de Alex do Djangocon Europe 2011, onde ele também fala sobre os problemas do postgres: blip.tv/djangocon-europe-2011/…
Bernhard Vallant
3
BTW, chamar o código c de PyPy ainda é muito mais lento do que usar módulos Python puros. Portanto, você provavelmente não obterá nenhum benefício ao executar Django + psycopg2 via PyPy. Você pode reescrever psycopg2 em RPython ou usar CPython e otimizar partes críticas de seu aplicativo com Cython .
Vladimir Protasov
Também: bitbucket.org/alex_gaynor/pypy-postgresql (meio antigo ...)
jperelli
2
Algumas pessoas ao meu redor recomendando psycopg2ct , mas sem django ... Pode ajudar ...
Dingo
qual é o seu sistema operacional, distribuição, versão?
pylover de

Respostas:

33

psycopg2cffi (atualizado em 2015)

psycopg2cffi é mais um substituto compatível com o psycopg2 e deve fornecer o melhor desempenho PostgreSQL com PyPy. Adicione isto ao seu settings.pypara permanecer compatível com ambos:

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

psycopg2-ctypes (2012)

Também sei que algumas pessoas estão usando psycopg2-ctypes.

Esta é a maneira mais fácil; para ficar compatível com ambos, basta adicionar este código em seu Django settings.py:

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

Testei isso há alguns lançamentos; infelizmente, em minha experiência, psycopg2-ctypes anula os pequenos ganhos de desempenho proporcionados pelo PyPy. Mas, YMMV, depende de como seu código é amigável ao JIT em geral e de quanto tempo você realmente gasta executando o código Python. E talvez o PyPy apenas tenha melhorado desde então.

e não acho que psycopg2-ctypes esteja pronto para o Windows ainda

Eu não tentei isso, mas ctypes é independente de plataforma. AFAICT você só precisa ter certeza de que a libpq.dllbiblioteca é carregável (localizada em um diretório em sua variável de ambiente PATH ou diretório local) e deve funcionar no Windows como no Linux.

pypy-postgresql

Vejo que Alex Gaynor fez um fork do PyPy chamado pypy-postgresql.

Não acho que seja uma boa escolha a longo prazo. O ramo não é atualizado há mais de um ano e minhas tentativas de construí-lo falharam. E parece errado codificar um driver PostgreSQL no interpretador de qualquer maneira.

Eu acredito que não há binários do pypy-postgresql por aí, então se você quiser usá-lo, você precisa construir todo o branch PyPy sozinho. Não é para os fracos: leva dezenas de minutos e uma máquina com pelo menos 4 GB de memória. (Instruções oficiais: http://pypy.org/download.html#building-from-source )

Para construir, primeiro você precisa da fonte. Se você tiver o Mercurial instalado, pode simplesmente hg clone https://bitbucket.org/alex_gaynor/pypy-postgresql. Caso contrário, você pode baixar o arquivo zip "dica" automagic: https://bitbucket.org/alex_gaynor/pypy-postgresql/get/tip.zip

Abra uma linha de comando, vá para o diretório descompactado e, em seguida, dentro pypy/translator/goal

Se você tiver o PyPy instalado, é recomendado usá-lo para a construção:

pypy translate.py -Ojit

De outra forma:

python translate.py -Ojit

Infelizmente, é aqui que meu conhecimento termina. Recebo o erro " BytecodeCorruption: unimplemented opcode, ofs=234, code=203, name=BUILD_LIST_FROM_ARG"

intgr
fonte
Você poderia adicionar um pouco, desde, você sabe, sobre o que pode ser necessário para fazer o pypy-pyscopg2 funcionar com o pypy sem a necessidade de compilar o pypy do código-fonte?
James R
1
Eu atualizei a resposta com detalhes sobre o quão longe eu fui. Infelizmente, a construção foi abortada com um erro. Lembro-me de passar uma tarde inteira tentando construí-lo da última vez e também falhei.
intgr
16

Alguns recursos adicionais:

  • Informações de compatibilidade do PyPy: adaptadores DB
  • Página PostgreSQL no wiki Python
  • psycopg2cffi por Konstantin Lopuhin:
    implementação baseada CFFI de psycopg2 para PyPy 2.0 e mais recentes
    ( post , GitHub repo , página PyPI , fio PyPy-dev )
    - Este parece ser o candidato mais forte atualmente, mas eu não testei ainda
  • psycopg2ct por Michael van Tellingen:
    implementação baseada em ctypes de psycopg2 para PyPy 1.6 e mais recente
    ( repositório GitHub , página PyPI )
  • pypy-postgresql por Alex Gaynor:
    porta RPython abandonada de psycopg2 implementada como um fork do PyPy (repositório Bitbucket )
  • pypq :
    "Driver compatível com Python PostgreSQL DBAPI 2.0 usando ctypes e libpq.so, funciona com PyPy"
    ( discussão , página PyPI )
  • bpgsql :
    " Cliente Barebones pure-python PostGreSQL . Compatível principalmente com DB-API 2.0 (PEP 249). Inclui um back-end Django 1.0 experimental"
    ( discussão , página da web , página do Google Code )
  • pg8000 :
    "uma interface Pure-Python compatível com DB-API 2.0 para o mecanismo de banco de dados PostgreSQL [...] não depende de nenhuma biblioteca externa (como um módulo python compilado ou biblioteca libpq do PostgreSQL)"
    ( página da web , repositório GitHub , Página PyPI )
Akaihola
fonte