前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django实战-番外篇-读写分离

Django实战-番外篇-读写分离

作者头像
小团子
发布2019-07-18 16:24:13
5880
发布2019-07-18 16:24:13
举报
文章被收录于专栏:数据云团数据云团

配置数据库读写分离,前提条件是要做好数据库层面的读写分离和数据同步。

① 配置数据库,以 sqlite 为例

代码语言:javascript
复制
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },
    'slave': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db2.sqlite3'),
    },
}

② 数据库迁移

python manage.py migrate 默认使用 defalut 的数据配置,完整的写法为:python manage.py migrate --database defalut,同样的迁移完默认的数据库后,也要迁移从数据库 python manage.py migrate --database slave

③ 读写分离

方式一:可以使用手动的方式指定数据库的读写,通过一个方法 .using("数据库")

models.xxx.objects.using("slave").first()

my_object.save(using="slave") 可以指定存储的模型

代码语言:javascript
复制
from django.shortcuts import HttpResponse
from . import models
代码语言:javascript
复制
#指定写的数据库 
def write(request):
    models.Goods.objects.using('default').create(name='熊猫公仔', price=12.99)
    return HttpResponse('写入成功')

# 指定读的数据库
def read(request):
    obj = models.Goods.objects.filter(id=1).using('slave').first()
    return HttpResponse(obj.name)

方式二:自动读写分离

通过配置数据库路由,来自动实现,这样就不需要每次读写都手动指定数据库了。数据库路由中提供了四个方法(db_for_read、db_for_write、allow_relation、allow_migrate)。这里主要用其中的两个:def db_for_read() 决定读操作的数据库,def db_for_write() 决定写操作的数据库。

④ 定义 Router 类

新建 db_router.py 脚本,定义 Router 类:

代码语言:javascript
复制
class MasterSlaveDBRouter(object):
    """读写分离路由"""
    def db_for_read(self, model, **hints):
        """读"""
        return "slave"

    def db_for_write(self, model, **hints):
        """写"""
        return "default"

    def allow_relation(self, obj1, obj2, **hints):
        """允许关联查询"""
        return True

⑤ 配置 Router

settings.py 中指定 DATABASE_ROUTERS

代码语言:javascript
复制
# 读写分离路由器
DATABASE_ROUTERS = ["utils.db_router.MasterSlaveDBRouter"]

⑥ 分库分表

在大型 web 项目中,常常会创建多个 app 来处理不同的业务,如果希望实现 app 之间的数据库分离,比如 app01 走数据库 db1,app02 走数据库 db2

代码语言:javascript
复制
class Router:
    def db_for_read(self, model, **hints):
        if model._meta.app_label == 'app01':
            return 'db1'
        if model._meta.app_label == 'app02':
            return 'db2'

    def db_for_write(self, model, **hints):
       if model._meta.app_label == 'app01':
            return 'db1'
       if model._meta.app_label == 'app02':
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据云团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档