2010-09-03 65 views
20

Đây hy vọng là một câu hỏi dễ dàng.Cấu hình nhiều cơ sở dữ liệu trong Django 1.2

Tôi đang gặp sự cố khi hiểu tài liệu về tính năng nhiều cơ sở dữ liệu mới trong Django 1.2. Chủ yếu, tôi không thể dường như tìm thấy một ví dụ về cách bạn thực sự sử dụng cơ sở dữ liệu thứ hai trong một trong các mô hình của bạn.

Khi tôi xác định một lớp mới trong models.py của mình, làm cách nào để chỉ định cơ sở dữ liệu mà tôi định kết nối?

settings.py My chứa một cái gì đó tương tự như -

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.mysql', 
     'NAME': 'modules', 
     'USER': 'xxx',      
     'PASSWORD': 'xxx',     
    }, 
    'asterisk': { 
     'ENGINE': 'django.db.backends.mysql', 
     'NAME': 'users',      
     'USER': 'xxxx',      
     'PASSWORD': 'xxxx',     
    } 

} 

Edit: Tôi đã đọc các tài liệu trên router như một hình nộm. Nếu bất cứ ai khác đang đấu tranh với điều này chỉ cần chắc chắn rằng bạn đọc nó 2 hoặc 3 lần trước khi bỏ cuộc!

Trả lời

25

Vâng, nó hơi phức tạp một chút.

Có một số cách bạn có thể triển khai. Về cơ bản, bạn cần một số cách để chỉ ra mô hình nào được kết hợp với cơ sở dữ liệu nào.

Tùy chọn đầu tiên

Đây là mã mà tôi sử dụng; hy vọng nó giúp.

from django.db import connections 

class DBRouter(object): 
    """A router to control all database operations on models in 
    the contrib.auth application""" 

    def db_for_read(self, model, **hints): 
     m = model.__module__.split('.') 
     try: 
      d = m[-1] 
      if d in connections: 
       return d 
     except IndexError: 
      pass 
     return None 

    def db_for_write(self, model, **hints): 
     m = model.__module__.split('.') 
     try: 
      d = m[-1] 
      if d in connections: 
       return d 
     except IndexError: 
      pass 
     return None 

    def allow_syncdb(self, db, model): 
     "Make sure syncdb doesn't run on anything but default" 
     if model._meta.app_label == 'myapp': 
      return False 
     elif db == 'default': 
      return True 
     return None 

Cách này hoạt động là tôi tạo tệp có tên cơ sở dữ liệu để sử dụng giữ mô hình của tôi. Trong trường hợp của bạn, bạn sẽ tạo một tệp riêng biệt models kiểu được gọi là asterisk.py nằm trong cùng một thư mục với các kiểu cho ứng dụng của bạn.

Trong file models.py của bạn, bạn muốn thêm

from asterisk import * 

Sau đó, khi bạn thực sự yêu cầu một bản ghi từ mô hình đó, nó hoạt động như thế này:

  1. records = MyModel.object.all()
  2. mô-đun cho MyModelmyapp.asterisk
  3. có kết nối có tên là "dấu hoa thị" để sử dụng.210 nó thay vì "mặc định"

Second Lựa chọn

Nếu bạn muốn có quyền kiểm soát cho mỗi mô hình của sự lựa chọn cơ sở dữ liệu, một cái gì đó như thế này sẽ làm việc:

from django.db import connections 

class DBRouter(object): 
    """A router to control all database operations on models in 
    the contrib.auth application""" 

    def db_for_read(self, model, **hints): 
     if hasattr(model,'connection_name'): 
      return model.connection_name 
     return None 

    def db_for_write(self, model, **hints): 
     if hasattr(model,'connection_name'): 
      return model.connection_name 
     return None 

    def allow_syncdb(self, db, model): 
     if hasattr(model,'connection_name'): 
      return model.connection_name 
     return None 

Sau đó cho mỗi mô hình:

class MyModel(models.Model): 
    connection_name="asterisk" 
    #etc... 

Lưu ý rằng tôi chưa thử nghiệm tùy chọn thứ hai này.

+1

Xin lỗi vì phản hồi bị trì hoãn, nhưng điều này vô cùng hữu ích! – HurnsMobile

+0

Xin chào, tôi đã thực hiện tùy chọn thứ hai của bạn. Nó hoạt động tốt ngoại trừ allow_syncdb. Tôi sẽ đăng câu trả lời dưới đây với allow_syncdb đang hoạt động cho bất kỳ người tìm kiếm nào trong tương lai. – Rich

+0

Cảm ơn vì điều này! Tôi đã có một dickens của một thời gian cố gắng để grok này từ các tài liệu django. –

3

Tài liệu trên automatic database routingmanually selecting a database không được trợ giúp?

+0

Tôi có thể thiếu điều gì đó nhưng tôi có thể nói không có ví dụ nào về cách xác định mô hình với bất kỳ thứ gì ngoài cơ sở dữ liệu mặc định. – HurnsMobile

+0

+1. Django có tài liệu tốt và các tài liệu hầu như luôn luôn là nơi đầu tiên để xem xét. –

+1

Như đã nêu trong câu hỏi, tôi gặp khó khăn trong việc hiểu tài liệu ... – HurnsMobile

8

Phụ lục cho Jordans trả lời ở trên.Đối với tùy chọn thứ hai, phương thức allow_syncdb hoạt động chính xác như sau:

def allow_syncdb(self, db, model): 
    if hasattr(model,'connection_name'): 
     return model.connection_name == db 
    return db == 'default' 
+0

Thú vị! Vì vậy, bạn đang thiết lập connection_name trong mô hình? –

+0

Có. Và nó hoạt động khá tốt ngoại trừ các trường ManyToMany, nơi tôi phải chỉ định một mô hình 'thông qua' nếu không Django tạo bảng 'thông qua' trong cơ sở dữ liệu mặc định. – Rich

+0

Chà! Tôi chắc chắn sẽ ghi nhớ về điều này. Làm việc tốt Rich. – HurnsMobile

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