2009-03-20 39 views
6

Có ai có kết nối tổng hợp làm việc với Django, SQLAlchemy và MySQL không?Kết nối vùng kết nối Django và các trường thời gian

Tôi đã sử dụng hướng dẫn này (http://node.to/wordpress/2008/09/30/another-database-connection-pool-solution-for-django-mysql/) đã hoạt động tốt nhưng vấn đề tôi gặp phải bất cứ khi nào tôi mang lại trường thời gian đang được chuyển đổi thành một timedelta vì chuyển đổi cụ thể của Django không được sử dụng.

đang chuyển đổi từ django/db/backends/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, 

})

Mã kết nối từ bài viết:

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 có ORM của riêng nó, nó không sử dụng SQlAlchemy trừ khi bạn thiết lập thủ công. –

Trả lời

1

Trong Django thân cây, chỉnh sửa django/db/init .py và nhận xét ra dòng:

signal.request_finished.connect (close_connection)

Trình xử lý tín hiệu này làm cho nó ngắt kết nối khỏi cơ sở dữ liệu sau mỗi yêu cầu. Tôi không biết tất cả các tác dụng phụ của việc này sẽ là gì, nhưng nó không có ý nghĩa gì khi bắt đầu một kết nối mới sau mỗi yêu cầu; nó phá hủy hiệu suất, như bạn đã nhận thấy.

Một thay đổi cần thiết khác là trong django/middleware/transaction.py; loại bỏ hai phép kiểm tra transaction.is_dirty() và luôn gọi cam kết() hoặc rollback(). Nếu không, nó sẽ không cam kết một giao dịch nếu nó chỉ đọc từ cơ sở dữ liệu, mà sẽ để lại khóa mở nên được đóng lại.

Các vấn đề liên quan