2010-04-14 33 views
22

Je suis intéressé par l'exécution de Django sur un framework async comme Concurrence ou gevent. Les deux cadres viennent avec son propre pilote MySQL asynchrone.Comment faire fonctionner Django avec des pilotes MySQL non supportés tels que gevent-mysql ou le pilote MySQL de Concurrence?

Problème: Django ne prend officiellement en charge que MySQLdb. Que dois-je faire pour que Django fonctionne avec les pilotes MySQL fournis avec gevent ou Concurrence?

Y a-t-il un guide étape par étape que je peux suivre? Est-ce une entreprise majeure?

Merci.

+0

En supposant que l'API de gevent-mysql correspond à MySQLdb, un backend de base de données personnalisé très simple serait trivial à écrire et à utiliser. Je sais que d'autres seraient intéressés donc s'il vous plaît partager si/quand vous faites cela. Les gens dans #gevent sur freenode aideraient avec des détails que je parie. – tmc

+0

https://github.com/petehunt/PyMySQL est une bibliothèque cliente pure-python compatible avec api MySQLdb, Mozilla l'utilise avec gevent pour le serveur Firefox Sync.Vous pouvez soit écrire un petit moteur de base de données personnalisé (comme je le recommande ci-dessus) ou simplement utiliser cette méthode: https://github.com/petehunt/PyMySQL/blob/master/pymysql/__init__.py#L110 pour corriger PyMySQL. – tmc

Répondre

36

trois applaudissements pour la suggestion de @ traviscline d'aller avec pymysql. sa suggestion était basée sur this post from mozilla. tout ce qu'il faut est un simple patch to your manage.py file

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

changer l'importation dans votre fichier de paramètres et monkey-patch() depuis pymysql est un pilote pur python. Travis a mentionné qu'il teste la compatibilité en modifiant les importations et en exécutant les tests unitaires pour pymysql, mysqldb et myconnpy.

notez qu'il existe déjà examples of finer details to watch out for - mais dans l'ensemble c'est une solution élégante et maintenable. Je mettrai à jour quand j'obtiendrai ceci courant dans la production!

+3

Je reçois une erreur «Thing2Literal» (ça ne ressemble pas à ça dans pymysql?) – Justin

+0

ce n'est pas un problème si vous utilisez une version assez récente de mysqldb. http://stackoverflow.com/a/15315546/424380 – egbutter

+0

aussi, bug 668664 mentionné ci-dessus (tuer des requêtes quand le processus parent est tué) n'a jamais été un problème notable pour moi dans la production .. le site n'a pas vu plus de quelques-uns milliers de demandes par jour, cependant, pendant que je travaillais dessus. – egbutter

-1

j'ai réussi à obtenir pymysql de travailler avec Django procédant comme suit:

  1. Commentaire sur l'essai, sauf bloc au début du fichier base.py, où MySQLdb est importé.
  2. Ajoutez les quatre lignes suivantes à base.py

    try: 
        import pymysql as Database 
    except ImportError: 
        pass 
    
  3. Comme mentionné dans le lien qui egbutter affiché, allez dans le fichier base.py et trouver-MySQLdb remplacer par pymysql au niveau des parties pertinentes de le fichier, c.-à-d. ne dérange pas de changer les messages d'erreur (vous pourriez, mais c'est à vous de décider).

  4. Enregistrez base.py et exécutez la commande suivante à partir de l'emplacement apt pour voir le démarrage du serveur.

    python manage.py runserver 
    
0

avec une base de données à faible latence, MySQLdb est assez bon, même utilisé avec gevent. Bien qu'il ne soit pas accessible, il est possible d'obtenir de bonnes performances en réutilisant la connexion à la base de données et en augmentant le nombre de travailleurs de gevent. La base de données est lourde et généralement vous n'avez pas besoin de créer des milliers de connexions simultanées pour tirer parti de ses performances, et le ratio 1: 1 de l'opérateur à la connexion n'est pas un très mauvais choix. Mais pour le cache mémoire, c'est une toute autre histoire.