2009-03-20 15 views
6

Qualcuno ha ottenuto il pooling di connessioni con Django, SQLAlchemy e MySQL?Pool di collegamento Django e campi orari

Ho usato questo tutorial (http://node.to/wordpress/2008/09/30/another-database-connection-pool-solution-for-django-mysql/) che ha funzionato benissimo ma il problema che sto avendo è ogni volta che restituisco un campo temporale che viene convertito in un timedelta poiché le conversioni specifiche di Django non vengono utilizzate.

codice di conversione da Django/db/backend/mysql/base.py

django_conversions = conversions.copy() 
django_conversions.update({ 
FIELD_TYPE.TIME: util.typecast_time, 
FIELD_TYPE.DECIMAL: util.typecast_decimal, 
FIELD_TYPE.NEWDECIMAL: util.typecast_decimal, 

})

codice Collegamento da articolo:

if settings.DATABASE_HOST.startswith('/'): 
      self.connection = Database.connect(port=kwargs['port'], 
               unix_socket=kwargs['unix_socket'], 
               user=kwargs['user'], 
               db=kwargs['db'], 
               passwd=kwargs['passwd'], 
               use_unicode=kwargs['use_unicode'], 
               charset='utf8') 
     else: 
      self.connection = Database.connect(host=kwargs['host'], 
               port=kwargs['port'], 
               user=kwargs['user'], 
               db=kwargs['db'], 
               passwd=kwargs['passwd'], 
               use_unicode=kwargs['use_unicode'], 
               charset='utf8') 
+1

Django ha il proprio ORM, non usa SQlAlchemy se non lo si imposta manualmente. –

risposta

1

Nel tronco Django, modificare Django/db/init .py e commentare la riga:

signal.request_finished.connect (close_connection)

Questo gestore di segnale lo interrompe dal database dopo ogni richiesta. Non so quali saranno gli effetti collaterali di questo, ma non ha senso iniziare una nuova connessione dopo ogni richiesta; distrugge le prestazioni, come hai notato.

Un'altra modifica necessaria è in django/middleware/transaction.py; rimuovere i due test transaction.is_dirty() e chiamare sempre commit() o rollback(). Altrimenti, non effettuerà il commit di una transazione se viene letta dal database, che lascerà i blocchi aperti che dovrebbero essere chiusi.