开发者

Multiple Database Config in Django 1.2

开发者 https://www.devze.com 2023-01-14 03:31 出处:网络
This is hopefully an easy question. I\'m having some trouble understanding the documentation for the new multiple database feature in Django 1.2. Primarily, I cant seem to find an example of how you

This is hopefully an easy question.

I'm having some trouble understanding the documentation for the new multiple database feature in Django 1.2. Primarily, I cant seem to find an example of how you actually USE the second database in one of your models.

When I define a new class in my models.py how do I specify w开发者_C百科hich database I intend on connecting to?

My settings.py contains something similar to -

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: I was reading the documentation on routers like a dummy. If anyone else is struggling with this just make sure you read it 2 or 3 times before giving up!


Yeah, it is a little bit complicated.

There are a number of ways you could implement it. Basically, you need some way of indicating which models are associated with which database.

First option

Here's the code that I use; hope it helps.

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

The way this works is I create a file with the name of the database to use that holds my models. In your case, you'd create a separate models-style file called asterisk.py that was in the same folder as the models for your app.

In your models.py file, you'd add

from asterisk import *

Then when you actually request a record from that model, it works something like this:

  1. records = MyModel.object.all()
  2. module for MyModel is myapp.asterisk
  3. there's a connection called "asterisk" so use it instead of "default"

Second Option

If you want to have per-model control of database choice, something like this would work:

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

Then for each model:

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

Note that I have not tested this second option.


An addendum to Jordans answer above. For the second option, the allow_syncdb method works correctly as follows:

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


Does the documentation on automatic database routing and manually selecting a database not help?

0

精彩评论

暂无评论...
验证码 换一张
取 消