2009-03-20 15 views
6

Czy ktoś ma połączenie w połączeniu z Django, SQLAlchemy i MySQL?Pule połączeń Django i pola czasowe

Korzystałem z tego samouczka (http://node.to/wordpress/2008/09/30/another-database-connection-pool-solution-for-django-mysql/), który działał świetnie, ale problem, który mam, polega na tym, że za każdym razem, gdy przywracam pole czasu, jest ono konwertowane na timedelta, ponieważ konwersje specyficzne dla Django nie są używane.

kod konwersji z django/db/mysql/backend/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, 

})

kod połączenia z artykułu:

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 ma własną ORM, nie używa SQlAlchemy, chyba że ręcznie ją skonfigurujesz. –

Odpowiedz

1

W Django tułowia, edycja Django/db/init .py i skomentuj linię:

signals.request_finished.connect (close_connection)

Ten moduł obsługi sygnału powoduje, że po każdym żądaniu rozłącza się z bazą danych. Nie wiem, jakie będą wszystkie skutki uboczne tego działania, ale nie ma sensu zakładanie nowego połączenia po każdym żądaniu; niszczy wydajność, jak zauważyłeś.

Kolejna niezbędna zmiana to django/middleware/transaction.py; usuń dwa testy transaction.is_dirty() i zawsze wywołaj metodę commit() lub rollback(). W przeciwnym razie transakcja nie zostanie zatwierdzona, jeśli zostanie odczytana tylko z bazy danych, co pozostawi otwarte blokady, które powinny zostać zamknięte.