1. 配置数据库
settings.py文件中数据库配置:
--用sqlite3:
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.创建models并执行数据库迁移
python manage.py makemigrations
python manage.py migrate -- database db2 # 将default库中的表结构同步到db2
3.操作读写分离
在视图函数中,通过objects.using("default") 指定使用哪个库
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)
通过配置数据库路由,来自动实现。
1. 新建 myrouter.py文件
class Router:
def db_for_read(self, model, **kwargs): # db_for_read固定写法,读操作自动匹配
return 'default'
def db_for_write(self, model, **kwargs): # db_for_write固定写法,写操作自动匹配
return 'db2'
2.在settings.py中配置router
DATABASE_ROUTERS = ['myrouter.Router',]
4.一主多从方案
新建myrouter.py文件
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中配置同上!!
5.分库分表
app之间的数据库分离,比如app01走数据库db1,app02走数据库db2
只需要修改,新建的myrouter.py文件
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'
settings.py中配置同上!!