multiple databases and multiple models in django

45,787

Solution 1

I fully agree with @alecxe on using the database router. I am currently using a single admin interface to manage multiple databases. Note that authentication for all databases are stored in the default database, so when you do the syncdb (with no arguments).

Generic Database Router

I found this implementation to be extremely flexible and useful.

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': '',                      
    },
}

Sample 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

Solution 2

In order to define specific databases used for specific models, you need to define a database router:

The easiest way to use multiple databases is to set up a database routing scheme. The default routing scheme ensures that objects remain ‘sticky’ to their original database (i.e., an object retrieved from the foo database will be saved on the same database). The default routing scheme ensures that if a database isn’t specified, all queries fall back to the default database.

See this snippet as an example: http://djangosnippets.org/snippets/2687/

Also see:

Share:
45,787
kuafu
Author by

kuafu

Updated on July 18, 2020

Comments

  • kuafu
    kuafu almost 4 years

    I have two databases and two models:the Admin and the user.

    I want to sync my models to the two databases; admin model to database A and user model to database B;

    If I am setting the model path to INSTALLED_APPS and syncdb, the two models will sync to the default database.

    if I set the database in the syncdb command such as sync --database="B", and the two models will sync to database B.

    So my problem is, how do I sync the two models to two databases?

  • kuafu
    kuafu over 10 years
    alecxe,thx,but what the app_label?should I set the app_label in django models?
  • alecxe
    alecxe over 10 years
    It doesn't really matter and it depends on how you will implement your router. FYI, there is an example in django docs that shows how to use app_label for routing.
  • kuafu
    kuafu over 10 years
    in the thenewcircle.com/s/post/1242/django_multiple_database_suppor‌​t, it gives:if model._meta.app_label == 'chinook': return 'chinookdb' so if I want to a model to operate on chinookdb,I should add a app_label in the meta,right?
  • alecxe
    alecxe over 10 years
    @young001 yes, if you are following instructions given in this article.
  • Vikas Ojha
    Vikas Ojha almost 9 years
    In both the models defined you have set the app_label to 'mux_data'. Is that intentional to show that both these models will go to database t29_db? And so if any other model has app_label 'T50_VATC', that will be saved in db t50_db.
  • jenny
    jenny almost 9 years
    @VikasNehaOjha Yes that was intentional. It was to show that each model can control where it's data is stored.
  • Vikas Ojha
    Vikas Ojha almost 9 years
    Thanks. Your answer helped me.
  • Mike O'Connor
    Mike O'Connor over 7 years
    @young001, you definitely don't need to declare the app_labels in the meta classes of your models--- if the model is defined within your app directory and not externally. I have just implemented two databases, with routers, as you described, and they are working in Django 1.8 without the explicit declaration. The example presented by Adam Lewis below does not contradict this but is instead a different approach involving overriding the default use of the app name as the app_label so as to not only avoid duplicate routers but also potentially use one database for a specified two or more apps.
  • Kiran K Telukunta
    Kiran K Telukunta over 7 years
    Where should be the class DatabaseAppsRouter? what should it import?
  • AivanF.
    AivanF. over 5 years
    As of today, the link is broken and the answer is not working. You should add the code directly to the answer otherwise it is not an answer anymore.
  • joe
    joe almost 5 years
    @AdamLewis Your link is dead by now. Add your copy please
  • mehmetö
    mehmetö over 4 years