2010-04-14 9 views
22

Estoy interesado en ejecutar Django en un marco asíncrono como Concurrence o gevent. Ambos marcos vienen con su propio controlador MySQL asincrónico.¿Cómo hacer que Django funcione con controladores MySQL no compatibles como gevent-mysql o el controlador MySQL de Concurrence?

El problema es que Django solo es compatible oficialmente con MySQLdb. ¿Qué debo hacer para que Django funcione con los controladores MySQL que vienen con gevent o Concurrence?

¿Existe alguna guía paso a paso que pueda seguir? ¿Es esto una gran empresa?

Gracias.

+0

Asumiendo que la API de gevent-mysql coincide con MySQLdb, un base de datos personalizado muy simple sería trivial de escribir y usar. Sé que otros estarían interesados, así que por favor compártanlo si lo hacen. La gente en #gevent en freenode me ayudaría con los detalles, apuesto. – tmc

+0

https://github.com/petehunt/PyMySQL es una biblioteca cliente compatible con api MySQLdb de python puro, Mozilla lo está utilizando con gevent para el servidor Firefox Sync.Puede escribir un pequeño motor de base de datos personalizado (como recomiendo arriba) o simplemente usar este método: https://github.com/petehunt/PyMySQL/blob/master/pymysql/__init__.py#L110 para parchear PyMySQL en. – tmc

Respuesta

36

tres porras para la sugerencia de @traviscline para ir con pymysql. su sugerencia se basó en this post from mozilla. todo lo que necesita es un simple patch to your manage.py file

#!/usr/bin/env python 
+try: 
+ import pymysql 
+ pymysql.install_as_MySQLdb() 
+except ImportError: 
+ pass 

cambio de la importación del archivo de configuración, y monkeypatch(), ya que es un conductor pymysql pitón puro.

travis mencionó que prueba la compatibilidad modificando las importaciones y ejecutando las pruebas unitarias para pymysql, mysqldb y myconnpy.

tenga en cuenta que ya hay examples of finer details to watch out for - pero, en general, se trata de una solución elegante y fácil de mantener. ¡lo actualizaré cuando lo ejecute en producción!

+3

Obtengo un error 'Thing2Literal' (¿no parece que está implementado en pymysql?) – Justin

+0

esto no es un problema si está utilizando una versión reciente de mysqldb. http://stackoverflow.com/a/15315546/424380 – egbutter

+0

también, el error 668664 mencionado anteriormente (matar consultas cuando el proceso principal se mata) nunca fue un problema notable para mí en la producción ... el sitio no vio más que unos pocos miles de solicitudes por día, sin embargo, mientras estaba trabajando en ello. – egbutter

-1

que tuvo éxito en conseguir pymysql trabajar con Django haciendo lo siguiente:

  1. comentario la excepción try-bloque en el comienzo del archivo base.py, donde ha sido importada MySQLdb.
  2. Añadir las cuatro líneas siguientes a base.py

    try: 
        import pymysql as Database 
    except ImportError: 
        pass 
    
  3. Como se mencionó en el enlace que egbutter publicado, vaya al archivo base.py y encontrar reemplazar MySQLdb con pymysql en las partes pertinentes de el archivo, es decir, no se moleste en cambiar los mensajes de error (podría, pero eso depende de usted).

  4. Guarde base.py y ejecute el siguiente comando desde la ubicación apt para ver el inicio del servidor.

    python manage.py runserver 
    
0

con una base de datos de baja latencia, MySQLdb es lo suficientemente bueno incluso se utiliza con GEvent. Aunque no es parcheable, es posible lograr un buen rendimiento reutilizando la conexión a la base de datos y aumentando el número de trabajadores gevent. La base de datos es pesada y, en general, no es necesario crear miles de conexiones simultáneas para aprovechar su rendimiento, y la relación 1: 1 de trabajador a conexión no es una opción muy mala. Pero para la memoria caché es totalmente otra historia.

Cuestiones relacionadas