Django中不同应用程序的不同数据库 [英] Different databases for different apps in Django

查看:113
本文介绍了Django中不同应用程序的不同数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Django站点中有多个应用程序: mainsite blog tutorials

I have multiple apps in my Django site: mainsite, blog and tutorials.

我可以在不同的Django应用程序中使用不同的数据库(例如PostgreSQL,MySQL)吗?

Can I use different databases (e.g. PostgreSQL, MySQL) in different Django apps?

推荐答案

1)更新要使用的数据库的设置。

1) Update settings for databases that you want to use.

设置.py

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': '/var/db/projectdb'
}
'db_app1': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': '/var/db/app1db'
}
'db_app2': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': '/var/db/app2db'
}

2)对于每个数据库,实现一个数据库路由器,该路由器将适当地路由查询。在您的情况下,在每个应用程序中实施。请注意,这或多或少来自Django文档。

2) For each database, implement a database router that will route the queries appropriately. In your case implement in each app. Note this more or less taken from django docs.

app1.dbRouter.py

app1.dbRouter.py

# DB router for app1

class App1DBRouter(object):
    """
    A router to control app1 db operations
    """
    def db_for_read(self, model, **hints):
        "Point all operations on app1 models to 'db_app1'"
        from django.conf import settings
        if not settings.DATABASES.has_key('db_app1'):
            return None
        if model._meta.app_label == 'app1':
            return 'db_app1'
        return None

    def db_for_write(self, model, **hints):
        "Point all operations on app1 models to 'db_app1'"
        from django.conf import settings
        if not settings.DATABASES.has_key('db_app1'):
            return None
        if model._meta.app_label == 'app1':
            return 'db_app1'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        "Allow any relation if a model in app1 is involved"
        from django.conf import settings
        if not settings.DATABASES.has_key('db_app1'):
            return None
        if obj1._meta.app_label == 'app1' or obj2._meta.app_label == 'app1':
            return True
        return None

    def allow_syncdb(self, db, model):
        "Make sure the app1 app only appears on the 'app1' db"
        from django.conf import settings
        if not settings.DATABASES.has_key('db_app1'):
            return None
        if db == 'db_app1':
            return model._meta.app_label == 'app1'
        elif model._meta.app_label == 'app1':
            return False
        return None

3)在settings.py

3) Update DATABASE_ROUTERS in settings.py

settings.py

settings.py

DATABASE_ROUTERS = ['app1.dbRouter.App1DBRouter', 'app2.dbRouter.App2DBRouter']

使用Python 3的用户注意

类似

        if not settings.DATABASES.has_key('db_app1'):

应成为

        if 'db_app1' not in settings.DATABASES:

这篇关于Django中不同应用程序的不同数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆