Django操作多个数据库读写分离

创建数据库:

      

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':'default',
        'HOST': '127.0.0.1',  # 主服务器的运行ip
        'PORT': 3306,   # 主服务器的运行port
        'USER': 'root',  # 主服务器的用户名
        'PASSWORD': '123456',  # 主服务器的密码

    },
    'slave': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':'slave',
        'HOST': '127.0.0.1',
        'PORT': 3306,
        'USER': 'root',
        'PASSWORD': '123456',

    }
}

 模型建表:

from django.db import models

# Create your models here.
class Article(models.Model):

    #verbose_name在admin中显示该字段的中文
    title = models.CharField(max_length=64)
    #文章摘要
    desc = models.CharField(max_length=255)

数据库迁移:

python manage.py makemigrations  # 在migrations文件夹下生成记录

python manage.py migrate --database default  # 默认可以不写参数

python manage.py migrate --database slave  # 在从库再迁移一次,就可以在上面建立相同的表

在项目的app中创建db_router.py文件,并在该文件中定义一个数据库路由类,用来进行读写分离,这个类最多提供四个方法,分别是:db_for_readdb_for_writeallow_relationallow_migrate,以下只写了三个。

class MasterSlaveDBRouter(object):
    """数据库主从读写分离路由"""
 
    def db_for_read(self, model, **hints):
        """读数据库"""
        return "slave"
 
    def db_for_write(self, model, **hints):
        """写数据库"""
        return "default"
 
    def allow_relation(self, obj1, obj2, **hints):
        """是否运行关联操作"""
        return True  

注意在settings.py中进行配置:

DATABASE_ROUTERS = ["app001.db_router.MasterSlaveDBRouter"]

视图函数即可操作:

def write(request):
    models.Article.objects.create(title='红楼梦',desc='good')
#使用using('default')可以指定数据库
return HttpResponse('写成功') def read(request): obj = models.Article.objects.filter(title='西游记').first() print(obj.title) return HttpResponse('读成功')