Django multi-database routing


Question

I have been using manual db selection to cope with a project which has two seperate dbs. I have defined my databases in the settings. After some further reading it seems that database routing is actually the way to go with this. However, after reading the docs and some relevant posts here I am more confused than ever.

In my settings I have:

DATABASES = {
    'default': {
       .... 
    },
    'my_db2': {
       ....
    }
}

DATABASE_ROUTERS = ['myapp2.models.MyDB2Router',]

I know I have to define my router class (I think in myapp2.models.py) like so:

class MyDB2Router(object):
"""A router to control all database operations on models in
the myapp2 application"""

def db_for_read(self, model, **hints):
    if model._meta.app_label == 'myapp2':
        return 'my_db2'
    return None

def db_for_write(self, model, **hints):
    if model._meta.app_label == 'myapp2':
        return 'my_db2'
    return None

def allow_relation(self, obj1, obj2, **hints):
    if obj1._meta.app_label == 'myapp2' or obj2._meta.app_label == 'myapp2':
        return True
    return None

def allow_syncdb(self, db, model):

    if db == 'my_db2':
        return model._meta.app_label == 'myapp2'
    elif model._meta.app_label == 'myapp2':
        return False
    return None

Then what? Does each model require a meta.app_label or is that automatic? Aside from that, I still get an error:

django.core.exceptions.ImproperlyConfigured: Error importing database router JournalRouter: "cannot import name connection

Can anyone help me understand what is happening and what is going wrong? Any help much appreciated.

1
32
12/19/2015 10:18:17 AM

OK, so I just solved my own problem. The router class goes into a separate file called routers.py under /myapp2. No meta.app_label is required as I guess it is automatically assigned. Hope this helps someone. I have also documented the process here.

26
11/9/2011 4:39:41 PM

Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow
Icon