python - Django中不同应用程序的不同数据库

标签 python django

我的 Django 站点中有多个应用程序:mainsiteblogtutorials

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

最佳答案

这是你必须做的事情。

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

settings.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 文档。

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中的DATABASE_ROUTERS

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:

关于python - Django中不同应用程序的不同数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13756356/

相关文章:

python - 什么时候应该使用 Popen() 什么时候应该使用 call()?

python - 在 gtk.Builder.connect_signals 上捕获 PyGTK RuntimeWarning

Python 3.4.3 json.dumps() "is not JSON serializable"从字节转换时出错

python - 如何用python类中的方法替换装饰器

python - 使用包含列表作为源的 Django 查询?

mysql - 如何创建一个简单的搜索页面来从 Django 搜索并返回 mysql 中单个列的数据?

python - 使Django中静态文件的浏览器缓存无效

python - 与亚当一起重新开始

python - Django TinyMCE : 'ModelFormMetaclass' object is not iterable

来自 S3 的 Django 缓存图像