2012-12-07 52 views
15

Tôi có nhiều ứng dụng trong trang web django của mình. nhưTôi có thể sử dụng các cơ sở dữ liệu khác nhau cho các ứng dụng khác nhau trong django

mainsite blog tutorials

Nhưng tôi muốn để lưu trữ mô hình khác nhau trong cơ sở dữ liệu khác nhau để họ có thể được tách ra

tôi có thể làm điều đó trong Django

+0

lẽ có liên quan: http://stackoverflow.com/questions/ 7970872/how-to-use-a-khác nhau-cơ sở dữ liệu cho mỗi ứng dụng-dụ-in-django; https://docs.djangoproject.com/en/dev/topics/db/multi-db/ –

Trả lời

21

Dưới đây là những gì bạn sẽ có phải làm để đi.

1) Cập nhật cài đặt cho cơ sở dữ liệu bạn muốn sử dụng.

settings.py

DATABASES = { 
'default': { 
    'ENGINE': 'django.db.backends.sqlite3', 
    'NAME': '/var/db/projectdb' 
} 
'db_app1': { 
    'ENGINE': 'django.db.backends.sqlite3', 
    'NAME': '/var/db/app1db' 
} 
'db_app2': { 
    'ENGINE': 'django.db.backends.sqlite3', 
    'NAME': '/var/db/app2db' 
} 

2) Đối với mỗi cơ sở dữ liệu, thực hiện một bộ định tuyến cơ sở dữ liệu đó sẽ định tuyến các truy vấn một cách thích hợp. Trong trường hợp của bạn, hãy triển khai trong từng ứng dụng. Lưu ý điều này nhiều hơn hoặc ít hơn được lấy từ tài liệu django.

app1.dbRouter.py

# DB router for app1 

class App1DBRouter(object): 
    """ 
    A router to control app1 db operations 
    """ 
    def db_for_read(self, model, **hints): 
     "Point all operations on app1 models to 'db_app1'" 
     from django.conf import settings 
     if not settings.DATABASES.has_key('app1'): 
      return None 
     if model._meta.app_label == 'app1': 
      return 'db_app1' 
     return None 

    def db_for_write(self, model, **hints): 
     "Point all operations on app1 models to 'db_app1'" 
     from django.conf import settings 
     if not settings.DATABASES.has_key('app1'): 
      return None 
     if model._meta.app_label == 'app1': 
      return 'db_app1' 
     return None 

    def allow_relation(self, obj1, obj2, **hints): 
     "Allow any relation if a model in app1 is involved" 
     from django.conf import settings 
     if not settings.DATABASES.has_key('app1'): 
      return None 
     if obj1._meta.app_label == 'app1' or obj2._meta.app_label == 'app1': 
      return True 
     return None 

    def allow_syncdb(self, db, model): 
     "Make sure the app1 app only appears on the 'app1' db" 
     from django.conf import settings 
     if not settings.DATABASES.has_key('app1'): 
      return None 
     if db == 'db_app1': 
      return model._meta.app_label == 'app1' 
     elif model._meta.app_label == 'app1': 
      return False 
     return None 

3) Cập nhật DATABASE_ROUTERS trong settings.py

settings.py

DATABASE_ROUTERS = ['app1.dbRouter.App1DBRouter', 'app2.dbRouter.App2DBRouter'] 
+0

Có phải tất cả. tôi có nghĩa là khi tôi tạo ra các mô hình từ admin, họ sẽ tự động được lưu trong cơ sở dữ liệu thứ hai. hoặc tôi cần phải làm nhiều thứ hơn cho admin – user825904

+0

Bạn cần phải làm syncdb, tôi nghĩ bạn có thể phải thiết lập lại nếu DB đã có mặt. – Rohan

+0

Tôi muốn đề nghị thay đổi tên của db từ 'app1' thành db_app1 để phân biệt khi nào nên sử dụng tên db và khi nào ứng dụng sẽ được sử dụng. –

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