首页 > 其他分享 >【高级】Django实现读写分离

【高级】Django实现读写分离

时间:2023-09-10 14:22:22浏览次数:39  
标签:配置文件 读写 分离 db Django DBRouter 数据库 路由

【1】第一步:配置文件配置多个数据库

  • 在Django的配置文件中的DATABASES参数中,添加多个数据库的配置信息。
  • 每个数据库都需要指定ENGINE(数据库引擎)和NAME(数据库名称),可以根据实际情况选择合适的数据库引擎和数据库名称。
  • 例如,在配置文件中添加两个数据库配置的示例:
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'master_db',
        'USER': 'master_user',
        'PASSWORD': 'master_password',
        'HOST': 'localhost',
        'PORT': '3306',
    },
    'slave': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'slave_db',
        'USER': 'slave_user',
        'PASSWORD': 'slave_password',
        'HOST': 'localhost',
        'PORT': '3307',
    }
}

【2】第二步:手动读写分离

  • 在需要进行读写操作的地方,使用.using()方法来指定使用哪个数据库进行操作。
  • 例如,向'db1'数据库进行写入操作的示例:
Book.objects.using('db1').create(name='西游记')

【3】第三步:自动读写分离

  • 创建一个Python文件,命名为db_router.py,并在其中定义一个类DBRouter,继承自django.db.utils.BaseDatabaseRouter,该类用于自动路由数据库。

  • 在DBRouter类中,需要实现db_for_read()db_for_write()方法,这两个方法分别用于决定读操作和写操作使用的数据库。

  • 例如,在DBRouter类中实现自动读写分离的示例:

class DBRouter(object):
    def db_for_read(self, model, **hints):
        # 多个从库 ['db1','db2','db3'] ---- 负载 --- random
        
        # 决定读操作使用的数据库
        return 'slave'

    def db_for_write(self, model, **hints):
        # 决定写操作使用的数据库
        return 'default'
  • model 是当前调用的表模型
    • 可以通过当前表模型进行分库分表
      • 一千万 在一张表
      • 一千亿 在另一张表

【4】第四步:配置文件配置路由

  • 在Django的配置文件中的DATABASE_ROUTERS参数中,指定使用自定义的DBRouter类来进行数据库路由。
  • 例如,在配置文件中配置使用DBRouter来进行数据库路由的示例:
DATABASE_ROUTERS = ['myapp.db_router.DBRouter']
  • 这样配置后,Django将会自动根据DBRouter类中定义的逻辑来进行读写操作的数据库路由。

  • 需要注意的是,以上示例仅为说明目的,实际使用时,需要根据具体的项目需求和数据库配置进行相应的修改。

【5】总结

  • 通过以上配置和操作,就可以在Django中实现读写分离。
  • 读操作会自动路由到指定的从库,而写操作则会路由到主库,实现了读写分离的效果。

标签:配置文件,读写,分离,db,Django,DBRouter,数据库,路由
From: https://www.cnblogs.com/dream-ze/p/17691176.html

相关文章

  • django-前端时间组件
    1、插件的下载BootstrapDatepicker是一款基于Bootstrap框架的日期选择控件,可以方便地在Web应用中添加可交互的日期选择功能。BootstrapDatepicker拥有丰富的选项和API,支持多种日期格式,可以自定义样式并支持各种语言。BootstrapDatepicker依赖bootstrap:bootstrap.min.css......
  • Django报错django.contrib.admin.sites.AlreadyRegistered
    Django报错django.contrib.admin.sites.AlreadyRegistered报错django.contrib.admin.sites.AlreadyRegistered:ThemodelOrderisalreadyregisteredwith'goods_service.OrderAdmin'.错误提示的意思是Order模型已经在goods_service.OrderAdmin中注册了,因此你不能再次......
  • QTablewidget的使用 读写与遍历
    QTableWidget表格中的数据读写操作//读数据QStringstr=ui->TableWidget->item(row,column)->text();//取出字符串//item的参数row,column是行和列,都是从0开始,注意不要越界。intnum=str.toInt();//如果需要的是整型数,可以转成int//写数据ui->TableWidget->item(row,col......
  • 分离式光电液位传感器有哪些优势
    分离式光电液位传感器相比传统光学传感器具有许多优势。分离式液位传感器采用了一体成型的设计,将菱镜部分直接设计到用户水箱上,避免了传统传感器需要移动水箱加水的问题。传感器独立于水箱外部,中间可以间隔空气,从而确保了水位感应的精准性。分离式光电液位传感器将光学组件分离出来......
  • 接口文档,jwt介绍和构成,jwt签发与认证,base64编码,drf-jwt使用,django-rest-framewor
    1接口文档#作为后端,接口写好了#作为前端,需要使用我们写的接口(移动端,web,桌面端)#后端需要写接口文档#接口文档的展现形式: 1word,md,写好传到公司的某个平台---》前端可以下载2自动生成接口文档---》后端通过配置--》把所写的接口都自动生成---》地址--》访问......
  • 社区版pycharm写django
    本人是在校学生,欢迎补充一.创建 1. django-adminstartproject项目名称 2. 企业版多生成templates文件与manage.py同级,修改settings文件中os.path.join(BASE_DIR).'templates' 3. 命令行生成标准的二.配置 1. asgi.py和wsgi.py接收网络请求前者同步后者异步 2. manage.py......
  • django-普通分页
    views.py代码:defperson_page(request):#从URL中取出参数page,这个参数是"?page=1"形式cur_page_num=request.GET.get('page')#取得PrettyNum中的记录总数total_count=models.PrettyNum.objects.all().count()#设定每一页显示多少条记录on......
  • django-普通分页实现
    views.py代码:#普通分页功能defperson_page(request):#从URL中取出参数page,这个参数是“page=1”形式cur_page_num=request.GET.get('page')#取得PrettyNum模型中的记录总数total_count=models.PrettyNum.objects.all().count()#设定每......
  • django高级
    jwt源码1.jwt详解jwt的全称是jsonwebtoken,一般用于用户认证#jwt的原理是什么?用户在第一次登录的时候,会将用户名、密码等信息传到我们的服务器上进行身份验证,验证成功后,服务器会存在密钥,对用户信息进行加密签发生成jwt,并返回给用户,用户将jwt存储下来,然后在下一次......
  • uniapp 开发安卓/ios文件读写
    利用5+appnative.jsio文件管理模块1.新建js文件//文件写入exportconstwriteFileIos=function(filename,data){ plus.io.requestFileSystem( plus.io.PUBLIC_DOCUMENTS,//文件系统中的根目录 fs=>{ //创建或打开文件,fs.root是根目录操作对象,直接fs表示......