经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Django » 查看文章
Django连接数据库并实现读写分离过程解析
来源:jb51  时间:2019/11/13 12:03:31  对本文有异议

这篇文章主要介绍了Django连接数据库并实现读写分离过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

前言

当一个项目当中有大量的数据的时候,你所有的IO操作都在一个数据库中操作,会造成项目的性能的降低。如果你能对项目中的数据进行读写分离的话,那么将大大提高你项目的性能。而Django自带的机制也对此提供了支持。我们可以简单的操作一下。(当然数据的同步还是需要运维同志的协助)

修改配置文件

Django默认的是default,我们按照它的格式直接添加一个新的配置:

  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.sqlite3',
  4. 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
  5. },
  6. 'db2': {
  7. 'ENGINE': 'django.db.backends.sqlite3',
  8. 'NAME': os.path.join(BASE_DIR, 'db2.sqlite3'),
  9. }
  10. }

当然,如果你不想使用默认的sqlite3,想使用mysql还需要自己进行一下配置

  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.mysql',
  4. 'HOST': '127.0.0.1', # 主服务器的运行ip
  5. 'PORT': 3306, # 主服务器的运行port
  6. 'USER': 'django', # 主服务器的用户名
  7. 'PASSWORD': 'django', # 主服务器的密码
  8. 'NAME': 'djangobase' # 数据表名
  9. },
  10. 'slave': {
  11. 'ENGINE': 'django.db.backends.mysql',
  12. 'HOST': '127.0.0.1',
  13. 'PORT': 8306,
  14. 'USER': 'django_slave',
  15. 'PASSWORD': 'django_slave',
  16. 'NAME': 'djangobase_slave'
  17. }
  18. }  

在项目目录下的__init__文件中添加以下代码,将数据连接方式改为pymysql

  1. import pymysql
  2. pymysql.install_as_MySQLdb()

将数据配置修改完之后就可以在models.py文件当中创建表,接下里就可以进行数据库迁移了

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

手动读写分离

在遇到数据库相关操作的话,需要手动指定要使用的相应数据库,不需要进行多余的配置,但是,当你数据的读写操作过于频繁的时候,这个方法就会略显繁琐。

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

自动读写分离

通过配置数据库路由,来自动实现读写分离,这样就不需要每次读写都手动指定数据库。

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

定义数据库路由类

  1. class MasterSlaveDBRouter(object):
  2. """数据库主从读写分离路由"""
  3. def db_for_read(self, model, **hints):
  4. """读数据库"""
  5. return "slave"
  6. def db_for_write(self, model, **hints):
  7. """写数据库"""
  8. return "default"
  9. def allow_relation(self, obj1, obj2, **hints):
  10. """是否运行关联操作"""
  11. return True  

配置Router

在settings.py中指定DATABASE_ROUTERS

  1. DATABASE_ROUTERS = ["app001.db_router.MasterSlaveDBRouter"]

可以指定多个数据库路由,比如对于读操作,Django将会循环所有路由中的db_for_read()方法,直到其中一个有返回值,然后使用这个数据库进行当前操作。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号