2010-04-14 11 views
22

Sono interessato a eseguire Django su un framework asincrono come Concurrence o gevent. Entrambi i framework sono dotati di un proprio driver MySQL asincrono.Come far funzionare Django con driver MySQL non supportati come gevent-mysql o il driver MySQL di Concurrence?

Il problema è che Django supporta ufficialmente MySQLdb. Cosa devo fare per far funzionare Django con i driver MySQL forniti con gevent o Concurrence?

C'è una guida passo-passo da qualche parte che posso seguire? È un'impresa importante?

Grazie.

+0

Supponendo che l'API di gevent-mysql corrisponda a MySQLdb, un semplice backend di database personalizzato sarebbe banale da scrivere e utilizzare. So che altri sarebbero interessati quindi per favore condividi se/quando lo fai. Le persone in #gevent su freenode mi aiuterebbero con i dettagli che ho scommesso. – tmc

+0

https://github.com/petehunt/PyMySQL è una libreria client compatibile con api MySQLdb pure-python, Mozilla lo sta usando con gevent per il server Firefox Sync.Potresti scrivere un piccolo motore db personalizzato (come consiglio in precedenza) o semplicemente utilizzare questo metodo: https://github.com/petehunt/PyMySQL/blob/master/pymysql/__init__.py#L110 per applicare PyMySQL a. – tmc

risposta

36

tre applausi per il suggerimento di @ traviscline di andare con pymysql. il suo suggerimento era basato su this post from mozilla. tutto quello che serve è un simple patch to your manage.py file

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

cambiando l'importazione nel vostro file di impostazioni, e monkeypatch() in quanto pymysql è un driver di pitone puro.

Travis ha dichiarato di testare la compatibilità modificando le importazioni e eseguendo le unittests per pymysql, mysqldb e myconnpy.

nota che ci sono già examples of finer details to watch out for - ma nel complesso si tratta di una soluzione elegante e manutenibile. aggiornerò quando avrò questo in esecuzione in produzione!

+3

Ottengo un errore 'Thing2Literal' (non sembra che sia implementato in pymysql?) – Justin

+0

questo non è un problema se stai usando una versione abbastanza recente di mysqldb. http://stackoverflow.com/a/15315546/424380 – egbutter

+0

inoltre, il bug 668664 menzionato sopra (uccidere le query quando il processo genitore viene ucciso) non è mai stato un problema evidente per me nella produzione .. il sito non ha visto più di qualche mille richieste al giorno, però, mentre ci stavo lavorando. – egbutter

-1

sono riuscito a ottenere pymysql a lavorare con Django nel seguente modo:

  1. commento la try-except blocco all'inizio del base.py file di , dove viene importato MySQLdb.
  2. Aggiungere le seguenti quattro linee di base.py

    try: 
        import pymysql as Database 
    except ImportError: 
        pass 
    
  3. Come menzionato nel link che egbutter inviato, passare al file base.py e trovare sostituisci MySQLdb con pymysql in porzioni rilevanti della il file, cioè non preoccuparti di cambiare i messaggi di errore (potresti farlo, ma dipende da te).

  4. Salvare base.py ed eseguire il seguente comando dalla posizione apt per vedere l'avvio del server.

    python manage.py runserver 
    
0

con un database bassa latenza, MySQLdb è abbastanza buono anche utilizzato con gevent. Anche se non è patchable, è possibile ottenere buone prestazioni riutilizzando la connessione al database e aumentando il numero di dipendenti gevent. Il database è pesante e in genere non è necessario creare migliaia di connessioni simultanee per sfruttare le sue prestazioni e il rapporto 1: 1 tra lavoratore e connessione non è una scelta sbagliata. Ma per la memoria cache è completamente un'altra storia.

Problemi correlati