kagxin / blog

个人博客:技术、随笔、生活
https://github.com/kagxin/blog/issues
7 stars 0 forks source link

django数据库读写分离 #1

Open kagxin opened 6 years ago

kagxin commented 6 years ago

django 多数据库支持

django 本身支持多数据库,这个为做读写分离提供了很大的便利。下面介绍基于django做数据库读写分离的方式。

默认前提

在setting中进行多数据库配置

DATABASES = {
    'default': {   # master db 使用主数据库作为默认数据库
        'NAME': 'multidb',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'sync_user',
        'PASSWORD': '****',
        'HOST':'47.94.110.*'
    },
    'slave': {  # slave db
        'NAME': 'multidb',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'root',
        'PASSWORD': '***',
        'HOST':'111.231.109.*'
    }
}
DATABASE_ROUTERS = ['multidb.router.DefaultRouter']   #添加在下面实现的路由配置

这里使用主数据库作为默认数据库,在migrate的时候不指定数据库,默认在此主数据库中进行表创建和修改。

路由配置

def counter():
    cnt = 0
    def add_one():
        nonlocal cnt
        cnt += 1
        return cnt
    return add_one

class DefaultRouter(object):
    def __init__(self):
        self.counter = counter()

    def db_for_read(self, model, **hints):
        cnt = self.counter()  # 如果存在多个从数据库,可以使用该闭包做一个简单的轮循等权路由
        print('read from slave. cnt:%d'%cnt)
        return 'slave'

    def db_for_write(self, model, **hints):
        print('write to defalut.')
        return 'default'

    def allow_relation(self, obj1, obj2, **hints):
        return None

    def allow_migrate(self, db, app_label, model=None, **hints):
        return None

ref : https://docs.djangoproject.com/en/2.0/topics/db/multi-db/ 示例工程: https://github.com/kagxin/recipes/tree/master/multidb

xStone9527 commented 6 years ago

可以看到增删改是在master数据库中进行的

查询是从主数据库中进行查询的 这一句 错了吧