2009-04-22 34 views
6

Tôi đã hỏi điều này trong nhóm người dùng không có phản hồi vì vậy tôi nghĩ tôi sẽ thử ở đây. Tôi đang cố thiết lập trình quản lý tùy chỉnh để kết nối với cơ sở dữ liệu khác trên cùng một máy chủ như kết nối mysql mặc định của tôi. Tôi đã thử theo các ví dụ herehere nhưng không có may mắn. Tôi nhận được một bộ trống khi trả lại MyCustomModel.objects.all().Nhiều Cơ sở dữ liệu trong Django 1.0.2 với trình quản lý tùy chỉnh

Đây là những gì tôi có trong manager.py

from django.db import models 
from django.db.backends.mysql.base import DatabaseWrapper 
from django.conf import settings 
class CustomManager(models.Manager): 
    """ 
    This Manager lets you set the DATABASE_NAME on a per-model basis. 
    """ 
    def __init__(self, database_name, *args, **kwargs): 
     models.Manager.__init__(self, *args, **kwargs) 
     self.database_name = database_name 
    def get_query_set(self): 
     qs = models.Manager.get_query_set(self) 
     qs.query.connection = self.get_db_wrapper() 
     return qs 
    def get_db_wrapper(self): 
     # Monkeypatch the settings file. This is not thread-safe! 
     old_db_name = settings.DATABASE_NAME 
     settings.DATABASE_NAME = self.database_name 
     wrapper = DatabaseWrapper() 
     wrapper._cursor(settings) 
     settings.DATABASE_NAME = old_db_name 
     return wrapper 

và đây là những gì tôi có trong models.py:

from django.db import models 
from myproject.myapp.manager import CustomManager 
class MyCustomModel(models.Model): 
    field1 = models.CharField(max_length=765) 
    attribute = models.CharField(max_length=765) 
    objects = CustomManager('custom_database_name') 
    class Meta: 
     abstract = True 

Nhưng nếu tôi chạy MyCustomModel.objects.all() tôi nhận được một danh sách trống.

Tôi khá mới ở công cụ này vì vậy tôi không chắc chắn nếu điều này làm việc với 1.0.2, tôi sẽ xem xét mã Trình quản lý để xem liệu tôi có thể tìm được số nhưng tôi tự hỏi liệu tôi có đang làm điều gì đó sai ở đây.

UPDATE: này bây giờ trong Django thân và sẽ là một phần của 1.2 phát hành http://docs.djangoproject.com/en/dev/topics/db/multi-db/

+0

Điều này vi phạm một số tính năng cần thiết của Django. Kết nối cơ sở dữ liệu duy nhất nằm trong mô-đun cài đặt của bạn. Bạn đang thực sự cố gắng làm gì? Bạn nên xem xét các cách tiếp cận khác thay vì phá vỡ Django. –

+0

Nếu bạn nhìn vào các ví dụ tôi đang cố gắng sử dụng, một ví dụ là từ Adrian. Tôi có một công việc xung quanh giải pháp mà tôi sử dụng một mô-đun trợ giúp và chỉ ghi đè lên chức năng lưu trong mô hình, nhưng đây là một chút của một hack và tôi không nhận được bất kỳ lợi ích django. Nếu bạn có đề xuất về cách thêm nhiều hỗ trợ cơ sở dữ liệu vào ứng dụng, vui lòng cho tôi biết. –

+0

Bạn có thể kiên nhẫn hơn một chút không? Có một dự án GSOC đang diễn ra ngay bây giờ, đó là thêm nhiều hỗ trợ cơ sở dữ liệu vào Django. – ironfroggy

Trả lời

4

Bạn có thể muốn nói chuyện với Alex Gaynor khi ông được thêm hỗ trợ MultiDB và nó cố định cho khả năng ra mắt vào Django 1.2. Tôi chắc chắn ông sẽ đánh giá cao phản hồi và đầu vào từ những người sẽ sử dụng MultiDB. Có các cuộc thảo luận về nó trong danh sách chính của django-developers. Chi nhánh MultiDB của ông thậm chí có thể sử dụng được, tôi không chắc chắn.

Vì tôi đoán bạn có thể không thể đợi và nếu nhánh MultiDB không thể sử dụng được, dưới đây là các tùy chọn của bạn.

  • Theo dõi Eric Flows method, nhớ rằng nó không được hỗ trợ và phát hành mới của Django có thể phá vỡ nó. Ngoài ra, một số nhận xét đề xuất số already been broken của nó. Điều này sẽ được hacky.
  • Tùy chọn khác của bạn sẽ là sử dụng phương pháp truy cập cơ sở dữ liệu hoàn toàn khác cho một trong các cơ sở dữ liệu của bạn. Có lẽ SQLAlchemy cho một và sau đó là Django ORM. Tôi sẽ đoán rằng một người có khả năng là trung tâm Django hơn và người kia là cơ sở dữ liệu kế thừa.

Để tóm tắt. Tôi nghĩ rằng hack MultiDB vào Django có lẽ là sai cách để đi trừ khi chuẩn bị của bạn để theo kịp với việc duy trì hack của bạn sau này. Vì vậy, tôi nghĩ rằng một ORM hoặc truy cập cơ sở dữ liệu sẽ cung cấp cho bạn các tuyến đường sạch nhất như sau đó bạn không đi ra ngoài với các tính năng được hỗ trợ và vào cuối ngày, tất cả chỉ là Python.

+1

Có vẻ như điều này đã được cam kết cố định ngay bây giờ và có sẵn các tài liệu http://docs.djangoproject.com/en/dev/topics/db/multi-db/ –

+0

Yup. Nó chắc chắn có và tuyệt vời của nó: D –

0

lẽ này isn t the answer your looking for, but it s lẽ là tốt nhất nếu bạn di chuyển tất cả mọi thứ bạn cần vào một cơ sở dữ liệu.

+0

Cảm ơn spence, đó không thực sự là một lựa chọn vì tôi muốn truy cập dữ liệu từ các ứng dụng khác như freeradius. –

1

Công ty của tôi đã thành công sử dụng nhiều cơ sở dữ liệu bằng cách làm theo chặt chẽ bài viết trên blog này: http://www.eflorenzano.com/blog/post/easy-multi-database-support-django/

+0

Cảm ơn Bluu Tôi nghĩ rằng tôi đã thấy điều này trước nhưng không chắc chắn nếu tôi đã thử nó hay không. Ứng dụng của tôi đang làm việc với một số phương thức trợ giúp có kết nối mysql riêng của họ vì vậy điều này sẽ phải chờ v2 tôi đoán. –

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