1. 配置数据库
settings.py文件中
用SQLite:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
},
'salve': {
'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': 'passwd',
'NAME': 'db_read'
},
'slave': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1',
'PORT': 8306,
'USER': 'root',
'PASSWORD': 'mysqlpwd',
'NAME': 'db_write'
}
}
2.创建models并执行数据库迁移(略)
3.操作读写分离
- 手动读写分离
------views.py视图文件中------
object.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.filter(id=1).using('salve').first()
return HttpResponse(obj.name)
- 自动读写分离
通过配置数据库路由,来自动实现。
- 新建router.py文件
class Router:
def db_for_read(self, model, **hints):
'''
db_for_read固定写法,读操作自动匹配
'''
return 'slave'
def db_for_write(self, model, **hints):
'''
db_for_write固定写法,写操作自动匹配
'''
return 'default'
- 配置router
------settings.py------文件中
DATABASE_ROUTERS = ['router.Router',]
4.一主多从方案
- 新建router.py文件
class Router:
def db_for_read(self, model, **hints):
"""
读取时随机选择一个数据库
"""
import random
return random.choice(['salve1', 'slave2', 'slave3'])
def db_for_write(self, model, **hints):
"""
写入时选择主库
"""
return 'default'
- 配置router
------settings.py------文件中
DATABASE_ROUTERS = ['router.Router',]
5.分库分表
- 新建router.py文件
app之间的数据库分离,比如app01走数据库salve1,app02走数据库slave2
class Router:
def db_for_read(self, model, **hints):
if model._meta.app_label == 'app01':
return 'salve1'
if model._meta.app_label == 'app02':
return 'slave2'
def db_for_write(self, model, **hints):
if model._meta.app_label == 'app01':
return 'slave1'
if model._meta.app_label == 'app02':
return 'slave2'
- 配置router
------settings.py------文件中
DATABASE_ROUTERS = ['router.Router',]