Django的数据库读写分离
Django的数据库读写分离
1、首先是配置数据库
在settings.py文件中增加多个数据库的配置:
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'), # 指定数据库名
}
}
使用mysql的配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1',
'PORT': 3306,
'USER': 'user',
'PASSWORD': 'pd',
'NAME': 'db_read'
},
'db2': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1',
'PORT': 8306,
'USER': 'root',
'PASSWORD': 'pd',
'NAME': 'db_write'
}
}
2、执行数据库迁移
python manage.py migrate -- database db2 # 将default库中的表结构同步到db2
执行完上面的指令之后,你就会发现,db2这个库里面就有了我们的表
3、看看读写分离的情况下,django怎么玩
- 手动读写分离
在视图函数中,通过objects.using("库名") 指定使用哪个库
from django.shortcuts import HttpResponse
from . import models
def write(request):
models.Products.objects.using('default').create(name='大猿', age=12)
return HttpResponse('写入成功')
def read(request):
obj = models.Products.objects.using('db2').filter(id=1).first()
return HttpResponse(obj.name)
- 自动读写分离
重写创建一个py文件,这里我们创建一个router.py文件
class Router:
# 读操作用default库,就return这个库名字符串
def db_for_read(self,model,**kwargs): # db_for_read固定写法,读操作自动匹配 # db_for_write固定写法,写操作自动匹配
return 'default'
# 读操作用db2库,就return这个库名字符串
def db_for_write(self,model,**kwargs): # db_for_write固定写法,写操作自动匹配
return 'db2'
还需要在settings.py文件中进行配置:
DATABASE_ROUTERS = ['app01.router.Router',]
#写上面这个类的路径,我的是在app01应用文件夹下面的router.py文件中了
设置自动之后就不需要在视图的逻辑函数中操作库时使用using
def dbtest(request):
data = []
# 向db2数据库中写入数据
models.Class.objects.create(name='大猿',age=18)
# 从db1中读取数据
data = models.Class.objects.all()
return render(request,'dbtest.html',{'data':data})
4、一主多从方案
一主多从的时候,也就是从多个数据库中读取的时候,我们可以这样操作:还是创建一个文件写入下边的函数
import random
class Router:
def db_for_read(self, model, **kwargs):
return random.choices(['db1', 'db2', 'db3'])
#多个库读的时候,可以简单的写个随机选择
def db_for_write(self, model, **kwargs):
return 'db'
在settings.py文件的配置和上边的一样:
DATABASE_ROUTERS = ['app01.router.Router',]
#写上面这个类的路径,我的是在app01应用文件夹下面的router.py文件中了
5、分库分表
当我们需要让不同的app操作不同的数据库时,比如app01操作数据库db1,app02操作数据库db2,我们应该如何去做,还是创建单独的文件,写法如下:
class Router:
def db_for_read(self, model, **kwargs):
if model._meta.app_label == 'app01':
return 'db1'
if model._meta.app_label == 'app02':
return 'db2'
def db_for_write(self, model, **kwargs):
if model._meta.app_label == 'app01':
return 'db1'
if model._meta.app_label == 'app02':
return 'db2'
# model._meta.app_label 获取当前函数所在app的app名称
# 如果是类,需要将类名加上
# model.UserInfo._meta.app_label 获取该类所在app的app名称
在settings.py文件的配置:
DATABASE_ROUTERS = ['app01.router.Router',]
#写上面这个类的路径,我的是在app01应用文件夹下面的router.py文件中了
Django的数据库读写分离的更多相关文章
- (转)Django配置数据库读写分离
转:https://blog.csdn.net/Ayhan_huang/article/details/78784486 转:http://www.cnblogs.com/dreamer-fish/p ...
- 配置Django中数据库读写分离
django在进行数据库操作的时候,读取数据与写数据(曾.删.改)可以分别从不同的数据库进行操作 修改配置文件: DATABASES = { 'default': { 'ENGINE': 'djang ...
- Django----配置数据库读写分离
Django配置数据库读写分离 https://blog.csdn.net/Ayhan_huang/article/details/78784486 https://blog.csdn.net/ayh ...
- django数据库读写分离
django数据库读写分离 1. 配置数据库 settings.py文件中 用SQLite: DATABASES = { 'default': { 'ENGINE': 'django.db.backe ...
- Django中MySQL读写分离技术
最近需要用到Django的MySQL读写分离技术,查了一些资料,把方法整理了下来. 在Django里实现对MySQL的读写分离,实际上就是将不同的读写请求按一定的规则路由到不同的数据库上(可以是不同类 ...
- linux中MySQL主从配置(Django实现主从读写分离)
一 linux中MySQL主从配置原理(主从分离,主从同步) mysql主从配置的流程大体如图: 1)master会将变动记录到二进制日志里面: 2)master有一个I/O线程将二进制日志发送到sl ...
- Spring aop应用之实现数据库读写分离
Spring加Mybatis实现MySQL数据库主从读写分离 ,实现的原理是配置了多套数据源,相应的sqlsessionfactory,transactionmanager和事务代理各配置了一套,如果 ...
- CYQ.Data V5 数据库读写分离功能介绍
前言 好多年没写关于此框架的新功能的介绍了,这些年一直在默默地更新,从Nuget上的记录就可以看出来: 这几天在看Java的一些东西,除了觉的Java和.NET的相似度实在太高之外,就是Java太原始 ...
- ThinkPHP v3.2.3 数据库读写分离,开启事务时报错:There is no active transaction
如题:ThinkPHP v3.2.3 数据库读写分离,开启事务时报错: ERR: There is no active transaction 刚开始以为是数据表引擎不对造成的,因为 有几张表的引擎是 ...
随机推荐
- Flink任务暂停重启
查看正在进行的任务 ./flink list 取消job并保存状态 ./flink cancel -s jobid 重启job ./flink run -s savepointPath -c 主类 x ...
- mysqldump 导出命令
在命令行下mysql的数据导出有个很好用命令mysqldump,它的参数有一大把,可以这样查看: mysqldump 最常用的: mysqldump -uroot -pmysql databasefo ...
- 【命令】at命令和cron命令
博文链接:https://www.cnblogs.com/l75790/articles/9191753.html
- 常见编译器EOP
delphi: 55 PUSH EBP 8BEC MOV EBP,ESP 83C4 F0 ADD ESP,-10 B8 A86F4B00 ...
- 开发规范(一) 如何记录日志 By 阿里
- JPDA 远程调试方法记录
一.JPDA概念 JPDA(Java platform debugger architecture)是java平台调试架构的简称,由java虚拟机后端和调试平台前端组成. 1.java虚拟机提供了ja ...
- VC维相关知识
假设空间H(Hypothesis Set) 输入空间D(X1...Xn) 1.增长函数(grown function) 是关于输入空间尺寸n的函数 假设空间对于D中所有实例实现分类(赋予标记)的分类方 ...
- Android驱动学习-内部机制_回顾binder框架关键点
内部机制_回顾binder框架关键点server注册服务时, 对每个服务都提供不同的ptr/cookie,在驱动程序里对每个服务都构造一个binder_node, 它也含有ptr/cookie cli ...
- Qt学习笔记-制作一个文本编辑器
创建一个MainWindow工程.添加一个TextEdit.垂直布局. 在menu上面创建新的action. 在新建的时候判断文本有没有被修改. 下面,将某个文件打开读入到TextEdit中. 保存文 ...
- 并发编程之JMM&Volatile(一)
并发 很多程序员应该对并发一词并不陌生,并发如同一把双刃剑,如果使用得当,可以帮助我们更好的压榨硬件的性能,反之,也会产生一些难以排查的问题.这里,先简单介绍下并发的几个基本概念. 进程与线程 进程: ...