2013-08-31 54 views
14

Tôi có hai cơ sở dữ liệu và hai mô hình: Quản trị viên và người dùng.nhiều cơ sở dữ liệu và nhiều mô hình trong django

Tôi muốn đồng bộ hóa các mô hình của mình với hai cơ sở dữ liệu; mô hình quản trị cơ sở dữ liệu A và mô hình người dùng tới cơ sở dữ liệu B;

Nếu tôi đặt đường dẫn mô hình thành INSTALLED_APPSsyncdb, hai mô hình sẽ đồng bộ hóa với cơ sở dữ liệu mặc định.

nếu tôi đặt cơ sở dữ liệu trong lệnh syncdb như sync --database="B", và hai mô hình sẽ đồng bộ với cơ sở dữ liệu B.

Vì vậy, vấn đề của tôi là, làm thế nào để đồng bộ hóa hai mô hình để hai cơ sở dữ liệu?

+0

@alecxe - không phải là OP nhưng bạn cố định vấn đề của tôi :) – whoisearth

Trả lời

14

Để xác định cơ sở dữ liệu cụ thể sử dụng cho các mô hình cụ thể, bạn cần phải xác định một database router:

Cách dễ nhất để sử dụng nhiều cơ sở dữ liệu là để thiết lập một chương trình định tuyến cơ sở dữ liệu . Lược đồ định tuyến mặc định đảm bảo rằng các đối tượng vẫn còn ‘dính’ với cơ sở dữ liệu gốc của chúng (ví dụ: đối tượng được truy xuất từ ​​ cơ sở dữ liệu foo sẽ được lưu trên cùng cơ sở dữ liệu). Lược đồ định tuyến mặc định đảm bảo rằng nếu cơ sở dữ liệu không được chỉ định, tất cả truy vấn sẽ quay trở lại cơ sở dữ liệu mặc định.

Xem đoạn này như là một ví dụ: http://djangosnippets.org/snippets/2687/

Xem thêm:

+0

alecxe, thx, nhưng những gì các app_label nên? Tôi đặt app_label trong các mô hình django? – young001

+0

Nó không thực sự quan trọng và nó phụ thuộc vào cách bạn sẽ thực hiện router của bạn. FYI, có một [ví dụ trong tài liệu django] (https: //docs.djangoproject.com/en/dev/topics/db/multi-db/# sử dụng bộ định tuyến) cho biết cách sử dụng 'app_label' để định tuyến. – alecxe

+0

trong https://thenewcircle.com/s/post/1242/django_multiple_database_support, nó cung cấp: nếu model._meta.app_label == 'chinook': trả về 'chinookdb' vì vậy nếu tôi muốn một mô hình hoạt động trên chinookdb , Tôi nên thêm một app_label trong meta, phải không? – young001

18

Tôi hoàn toàn đồng ý với @alecxe về cách sử dụng bộ định tuyến cơ sở dữ liệu. Tôi hiện đang sử dụng một giao diện quản trị duy nhất để quản lý nhiều cơ sở dữ liệu. Lưu ý rằng xác thực cho tất cả các cơ sở dữ liệu được lưu trữ trong cơ sở dữ liệu mặc định, vì vậy khi bạn thực hiện syncdb (không có đối số).

Generic Cơ sở dữ liệu Router

tôi thấy this thực hiện là cực kỳ linh hoạt và hữu ích.

Settings.py

# Define the database manager to setup the various projects 
DATABASE_ROUTERS = ['manager.router.DatabaseAppsRouter'] 
DATABASE_APPS_MAPPING = {'mux_data': 't29_db', 
         'T50_VATC':'t50_db'} 

DATABASES = { 
    'default': { 
      'ENGINE': 'django.db.backends.postgresql_psycopg2', 
      'NAME': 'fail_over',      
      'USER': 'SomeUser',      
      'PASSWORD': 'SomePassword',     
      'HOST': '127.0.0.1',      
      'PORT': '',      
    }, 

    't29_db': { 
      'ENGINE': 'django.db.backends.postgresql_psycopg2', 
      'NAME': 'mux_stage',      
      'USER': 'SomeUser',      
      'PASSWORD': 'SomePassword',     
      'HOST': '127.0.0.1',      
      'PORT': '',      
    }, 

    't50_db': { 
      'ENGINE': 'django.db.backends.postgresql_psycopg2', 
      'NAME': 't50_vatc',      
      'USER': 'SomeUser',      
      'PASSWORD': 'SomePassword',     
      'HOST': '127.0.0.1',      
      'PORT': '',      
    }, 
} 

mẫu Models

# Create your models here. 
class Card_Test(models.Model): 
    name = models.TextField(max_length=100) 
    description = models.TextField(max_length=200) 
    units = models.TextField(max_length=500) 
    result_tags = models.TextField(max_length=500) 

    class Meta: 
     app_label = 'mux_data' 

    def __unicode__(self): 
     return self.name 

class Status_Type(models.Model): 
    status = models.CharField(max_length=25) 

    class Meta: 
     app_label = 'mux_data' 

    def __unicode__(self): 
     return self.status 
+0

Trong cả hai mô hình được xác định bạn đã đặt app_label thành 'mux_data'. Điều đó có ý định cho thấy rằng cả hai mô hình này sẽ chuyển sang cơ sở dữ liệu t29_db? Và vì vậy nếu bất kỳ mô hình nào khác có app_label 'T50_VATC', mô hình đó sẽ được lưu trong db t50_db. –

+0

@VikasNehaOjha Vâng đó là cố ý. Đó là để cho thấy rằng mỗi mô hình có thể kiểm soát nơi lưu trữ dữ liệu của nó. –

+0

Cảm ơn. Câu trả lời của bạn đã giúp tôi. –