On Fri, Oct 12, 2012 at 4:54 PM, mnowotka <
mmm...@gmail.com> wrote:
> I have django running on oracle backend. I need to use two schemas - one for
> a legacy DB, second one for all django related tables.
>
> So this is my settings.DATABASES:
>
> DATABASES = {
>
> 'default' : {
> 'ENGINE': 'django.db.backends.oracle'
> 'NAME': 'django',
> 'USER': 'django-tables',
> 'PASSWORD': '****',
> 'HOST': 'localhost',
> 'PORT': '1531',
> },
>
> APPS_DB : {
> 'ENGINE': 'django.db.backends.oracle',
> 'NAME': 'django',
> 'USER': 'legacy-stuff',
> 'PASSWORD': '****',
> 'HOST': 'localhost',
> 'PORT': '1531',
> },
> }
>
> I also defined router:
>
> class MyRouter(object):
> """A router to control all database operations on models"""
>
> def __init__(self):
> aux = []
> for app in settings.INSTALLED_APPS:
> if not app.endswith('myapp'):
> aux.append(app)
> self.djangoStuff = tuple(map(lambda x: x[x.rfind('.')+1:], aux))
>
> def is_django_stuff(self, model):
> return model._meta.app_label in self.djangoStuff
>
> def db_for_read(self, model, **hints):
> "Point all django apps models to separate DB"
>
logger.info("READ from " + model._meta.app_label)
> if self.is_django_stuff(model):
>
logger.info("Will be directed to default DB")
> return None
>
logger.info("Will be directed to legacy DB")
> return settings.APPS_DB
>
> def db_for_write(self, model, **hints):
> "Point all django apps models to separate DB"
>
logger.info("WRITE")
> if self.is_django_stuff(model):
> return None
> return settings.APPS_DB
>
> def allow_relation(self, obj1, obj2, **hints):
> "Allow any relation"
>
logger.info("ALLOW REL")
> return True
>
> def allow_syncdb(self, db, model):
> "Allow syncdb for all managed objects"
>
logger.info("ALLOW SYNC")
> if db == 'default' and self.is_django_stuff(model):
> return True
> if db != 'default' and not self.is_django_stuff(model):
> return True
> return False
>
> Now I have very simple model:
>
> class Poll(models.Model):
> question = models.CharField(max_length=200)
> user = models.ForeignKey(User)
> pub_date = models.DateTimeField('date published')
>
> I make two syncdbs:
>
> python manage.py syncdb
> python manage.py syndb --database apps
>
> Everything goes fine. Then I create poll object using 'python manage.py
> shell'
>
> superuser = User.objects.all()[0]
> p = Poll(question="foo", user = superuser, pub_date = datetime.now())
> p.save()
>
> And I try to retrieve user from poll:
>
> a = Poll.objects.all()
> b = len(a)
> b = a[0]
> c = b.artist
You can't have relationships between models stored in different databases.
What happens when you define such an invalid relationship and follow
it, Django will use the database specified in b._state.db, and not
what the router determines.
It is an impossibility to have relationships that span different
databases - ie, this is not a Django limitation - so this is just
describing what would happen when you attempt to do something invalid.
Cheers
Tom