2009-03-20 14 views
6

¿Alguien ha conseguido la agrupación de conexiones trabajando con Django, SQLAlchemy y MySQL?campos de tiempo y agrupamiento de conexiones de Django

Utilicé este tutorial (http://node.to/wordpress/2008/09/30/another-database-connection-pool-solution-for-django-mysql/) que funcionó muy bien, pero el problema que tengo es que cada vez que devuelvo un campo de tiempo, se convierte a un timedelta porque las conversiones específicas de Django no se están utilizando.

código de conversión de 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, 

})

código de conexión del artículo:

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 tiene su propio ORM, no usa SQlAlchemy a menos que lo configure manualmente. –

Respuesta

1

En Django tronco, editar django/db/init .py y comente la línea:

signals.request_finished.connect (close_connection)

Este controlador de señal hace que se desconecte de la base de datos después de cada solicitud. No sé cuáles serán todos los efectos secundarios de hacer esto, pero no tiene sentido iniciar una nueva conexión después de cada solicitud; destruye el rendimiento, como habrás notado.

Otro cambio necesario es en django/middleware/transaction.py; elimine las dos pruebas transaction.is_dirty() y siempre invoque commit() o rollback(). De lo contrario, no comprometerá una transacción si solo lee de la base de datos, lo que dejará bloqueos abiertos que deberían cerrarse.

Cuestiones relacionadas