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.
Respostas:
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.py
para permanecer compatível com ambos:psycopg2-ctypes (2012)
Esta é a maneira mais fácil; para ficar compatível com ambos, basta adicionar este código em seu Django
settings.py
: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.
Eu não tentei isso, mas ctypes é independente de plataforma. AFAICT você só precisa ter certeza de que a
libpq.dll
biblioteca é 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
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.zipAbra 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:
De outra forma:
Infelizmente, é aqui que meu conhecimento termina. Recebo o erro "
BytecodeCorruption: unimplemented opcode, ofs=234, code=203, name=BUILD_LIST_FROM_ARG
"fonte
Alguns recursos adicionais:
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
implementação baseada em ctypes de psycopg2 para PyPy 1.6 e mais recente
( repositório GitHub , página PyPI )
porta RPython abandonada de psycopg2 implementada como um fork do PyPy (repositório Bitbucket )
"Driver compatível com Python PostgreSQL DBAPI 2.0 usando ctypes e libpq.so, funciona com PyPy"
( discussão , página PyPI )
" 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 )
"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 )
fonte