django 对多个数据库支持

发布时间:2020-04-05 22:43:24 作者:青亦
来源:网络 阅读:1087

数据库自动路由

使用多数据库最简单的方法是建立一个数据库路由模式。默认的路由模式确保对象’粘滞‘在它们原始的数据库上(例如,从foo 数据库中获取的对象将保存在同一个数据库中)。默认的路由模式还确保如果没有指明数据库,所有的查询都回归到default数据库中。

你不需要做任何事情来激活默认的路由模式 —— 它在每个Django项目上’直接‘提供。然而,如果你想实现更有趣的数据库分配行为,你可以定义并安装你自己的数据库路由。

数据库路由

数据库路由是一个类,它提供4个方法:

路由不必提供所有这些方法 —— 它可以省略一个或多个。如果某个方法缺失,在做相应的检查时Django 将忽略该路由。

例子:

DATABASES = {
    'auth_db': {
        'NAME': 'auth_db',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'mysql_user',
        'PASSWORD': 'swordfish',
    },
    'primary': {
        'NAME': 'primary',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'mysql_user',
        'PASSWORD': 'spam',
    },
    'replica1': {
        'NAME': 'replica1',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'mysql_user',
        'PASSWORD': 'eggs',
    },
    'replica2': {
        'NAME': 'replica2',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'mysql_user',
        'PASSWORD': 'bacon',
    },}

现在我们将需要处理路由。首先,我们需要一个路由,它知道发送auth 应用的查询到auth_db

class AuthRouter(object):
    """    A router to control all database operations on models in the    auth application.    """
    def db_for_read(self, model, **hints):
        """        Attempts to read auth models go to auth_db.        """
        if model._meta.app_label == 'auth':
            return 'auth_db'
        return None

    def db_for_write(self, model, **hints):
        """        Attempts to write auth models go to auth_db.        """
        if model._meta.app_label == 'auth':
            return 'auth_db'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        """        Allow relations if a model in the auth app is involved.        """
        if obj1._meta.app_label == 'auth' or \           obj2._meta.app_label == 'auth':
           return True
        return None

    def allow_migrate(self, db, app_label, model=None, **hints):
        """        Make sure the auth app only appears in the 'auth_db'        database.        """
        if app_label == 'auth':
            return db == 'auth_db'
        return None

我们还需要一个路由,它发送所有其它应用的查询到primary/replica 配置,并随机选择一个replica 来读取:

import randomclass PrimaryReplicaRouter(object):
    def db_for_read(self, model, **hints):
        """        Reads go to a randomly-chosen replica.        """
        return random.choice(['replica1', 'replica2'])

    def db_for_write(self, model, **hints):
        """        Writes always go to primary.        """
        return 'primary'

    def allow_relation(self, obj1, obj2, **hints):
        """        Relations between objects are allowed if both objects are        in the primary/replica pool.        """
        db_list = ('primary', 'replica1', 'replica2')
        if obj1._state.db in db_list and obj2._state.db in db_list:
            return True
        return None

    def allow_migrate(self, db, app_label, model=None, **hints):
        """        All non-auth models end up in this pool.        """
        return True

最后,在设置文件中,我们添加如下内容(替换path.to.为该路由定义所在的真正路径):

DATABASE_ROUTERS = ['path.to.AuthRouter', 'path.to.PrimaryReplicaRouter']


推荐阅读:
  1. Python基础(Django三——Model)
  2. 探索Django ORM的极限

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

django 多数据库 dj

上一篇:Linux脚本小知识之"$x"含义

下一篇:go语言渐入佳境[9]-doubleloop

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》