基于mysql的Django读写分离(仅供本人学习使用)

实际的生产环境中:
由单台Mysql作为独立的数据库是不能满足实际需求的。一般来说都是通过主从复制(Master-Slave)的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。

基本的原理是:
	让主数据库处理增、改、删操作(INSERT、UPDATE、DELETE),
	而从数据库处理SELECT查询操作。

在django项目中的应用

1. 在项目中的settings文件中配置数据库:

DATABASES = {
		    'default': {
		        'ENGINE': 'django.db.backends.mysql',
		        'NAME': 'qqsx_gz',
		        'USER':'root',
		        'PASSWORD':'1234',
		        'PORT':'3306',
		        'HOST':'localhost'
		    },
		    'slave': {
		        'ENGINE': 'django.db.backends.mysql',
		        'NAME': 'qqsx_02',
		        'USER': 'root',
		        'PASSWORD': '1234',
		        'HOST': 'localhost',
		        'PORT': '3306'
		    },
		}

2. 在mysql中创建 qqsx_02 数据库:

3. 将qqsx_gz数据库表同步到qqsx_02数据库:

命令行执行迁移

python manage.py migrate --database slave   # 将主数据库中的数据表迁移到从数据库

mysql的读写分离在django框架中有两种方式设置:

1. 手动方式:
在使用数据库时,通过.using(db_name)来手动指定要使用的数据库
例如:

GoodInfo.object.using('default').all() 说明default这个设置下的数据库是用来专门读取数据的
Usermessage.object.using('slave').create() 说明slave这个设置下的数据库是专门来写入数据的

2. 自动方式:

	a. 在项目的根目录创建myrouter.py脚本:
	
		class DBRouter(object):

			    def db_for_read(self, model, **hints):
			        return 'default'

			    def db_for_write(self, model, **hints):
			        return 'slave'
		      
	b. 在项目中的配置文件加上数据库路由相关配置
	
		DATABASE_ROUTERS = ['myrouter.DBRouter']

tips: 拓展知识:

	1 一主多从方案:

		class Router: 
			def db_for_read(self, model, **hints): 
			""" 读取时随机选择一个数据库 """ 
				import random 
				return random.choice(['db2', 'db3', 'db4']) 

			def db_for_write(self, model, **hints): 
				""" 写入时选择主库 """ 
				return 'default'

	
	2 分库分表:

		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': 
					return 'db2'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值