Django数据库连接与读写分离配置详解

青禾
青禾
发布时间:2026-10-13 | 4人浏览过
原创

本文详细解析如何在Django项目中配置MySQL数据库并实现读写分离。通过修改settings.py添加主从库配置,使用pymysql驱动,并编写自定义数据库路由类MasterSlaveDBRouter。文章涵盖手动指定数据库与自动路由两种方案,帮助提升高并发场景下的数据库读写性能。

Django数据库连接与读写分离配置详解

本文深入解析Django连接数据库及实现读写分离的具体步骤,内容包含详细的配置示例与代码说明,对开发者在实际项目中优化数据库性能具有重要的参考价值。

前言

当项目数据量巨大时,若所有IO操作均集中在一台数据库上,将严重拖累系统性能。实施读写分离能显著提升项目运行效率。Django框架原生支持这一机制,通过简单配置即可实现(注:数据同步需运维人员配合完成)。

修改数据库配置文件

修改配置文件

Django默认使用名为default的配置项。我们可以参照其格式,在配置文件中新增一个数据库配置项,例如db2。


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'),
  }
}

若不使用默认的SQLite3,而是希望使用MySQL数据库,则需要进行额外的驱动配置。


DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.mysql',
    'HOST': '127.0.0.1', # 主服务器的运行ip
    'PORT': 3306,  # 主服务器的运行port
    'USER': 'django', # 主服务器的用户名
    'PASSWORD': 'django', # 主服务器的密码
    'NAME': 'djangobase'  # 数据表名
  },
  'slave': {
    'ENGINE': 'django.db.backends.mysql', 
    'HOST': '127.0.0.1',
    'PORT': 8306,
    'USER': 'django_slave',
    'PASSWORD': 'django_slave',
    'NAME': 'djangobase_slave'
  }
}  

在项目目录下的__init__.py文件中添加特定代码,将数据连接方式切换为pymysql,以兼容MySQL驱动。


import pymysql
pymysql.install_as_MySQLdb()

完成数据配置后,即可在models.py中定义数据表模型,随后执行数据库迁移命令以同步结构。


python manage.py makemigrations # 在migrations文件夹下生成记录
python manage.py migrate --database default # 默认可以不写参数
python manage.py migrate --database db2 # 在从库再迁移一次,就可以在上面建立相同的表

手动指定数据库操作

手动读写分离

在进行数据库操作时,可以手动指定使用的数据库实例,无需额外配置。然而,当读写操作极其频繁时,这种手动指定方式会显得繁琐且效率低下。


from django.shortcuts import render, HttpResponse
from app001 import models
# Create your views here.
def write(request):
  models.User.objects.using('default').create(name='张三', pwd='123', phone=1234)
  return HttpResponse('写成功')
def read(request):
  obj = models.User.objects.filter(id=1).using('db2').first()
  return HttpResponse('读成功')

配置自动读写分离路由

自动读写分离

通过配置数据库路由(Database Router),可以实现自动化的读写分离,从而避免每次读写都手动指定数据库,简化开发流程。

在项目的app目录下创建db_router.py文件,并在其中定义一个数据库路由类。该类最多可包含四个方法:db_for_read、db_for_write、allow_relation和allow_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  

配置Router

在settings.py文件中指定DATABASE_ROUTERS变量,指向刚才创建的路由类。


DATABASE_ROUTERS = ["app001.db_router.MasterSlaveDBRouter"]

可以配置多个数据库路由。对于读操作,Django会遍历所有路由中的db_for_read()方法,直到找到返回数据库名的路由,随后使用该数据库执行当前操作。

以上即为Django数据库连接及读写分离配置的全部内容,希望对学习与实践有所帮助。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表