django -- 数据库的配置 读写分离 一主多从 分库分表

django 数据库相关配置

I.读写分离

1.手动分库的写法

配置多个数据库

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },
    'db2': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db2.sqlite3'),
    },

}

配置之后迁移数据库

python manage.py migrate

视图函数中进行orm操作时,可以指定数据库

# Create your views here.
def index(request, *args):
	obj = models.Student.objects.using('deafult').get(pk=3)
    obj2 = models.Student.objects.using('db2').create(name='xxx',class='1')
    return render(request, 'index.html',{'time':time.time()})

2.自动分库的写法

settings.py中配置

DATABASE_ROUTERS = ['myrouter.Router']

新建一个myrouter.py文件

class Router:
    def db_for_read(self, model, **kwargs):
        return 'default'

    def db_for_write(self, model, **kwargs):
        return 'db2'

此时在视图函数中就不用手动指定库名了

II.一主多从的配置

要求一个库中写入,多个库中读取

myrouter.py中

import random
class Router:
    """
    一主多从
    """

    def db_for_read(self, model, **kwargs):
        return random.choice(['db1', 'db2', 'db3'])  # 这是自己做的逻辑,还可以加权重

    def db_for_write(self, model, **kwargs):
        return 'default'

III.分库分表的配置

class Router:
    """
    分库分表
    app01的操作  default
    app02的操作  db2
    """

    def db_for_read(self, model, **kwargs):

        if model._meta.app_label == 'app01':
            return 'default'
        elif model._meta.app_label == 'app02':
            return 'db2'

    def db_for_write(self, model, **kwargs):
        if model._meta.app_label == 'app01':
            return 'default'
        elif model._meta.app_label == 'app02':
            return 'db2'
posted @ 2019-06-26 21:23  robertx  阅读(503)  评论(0编辑  收藏  举报