Django连接数据库并实现读写分离过程解析
这篇文章主要介绍了Django连接数据库并实现读写分离过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
前言
当一个项目当中有大量的数据的时候,你所有的IO操作都在一个数据库中操作,会造成项目的性能的降低。如果你能对项目中的数据进行读写分离的话,那么将大大提高你项目的性能。而Django自带的机制也对此提供了支持。我们可以简单的操作一下。(当然数据的同步还是需要运维同志的协助)
修改配置文件
Django默认的是default,我们按照它的格式直接添加一个新的配置:
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__文件中添加以下代码,将数据连接方式改为pymysql
importpymysql pymysql.install_as_MySQLdb()
将数据配置修改完之后就可以在models.py文件当中创建表,接下里就可以进行数据库迁移了
pythonmanage.pymakemigrations#在migrations文件夹下生成记录 pythonmanage.pymigrate--databasedefault#默认可以不写参数 pythonmanage.pymigrate--databasedb2#在从库再迁移一次,就可以在上面建立相同的表
手动读写分离
在遇到数据库相关操作的话,需要手动指定要使用的相应数据库,不需要进行多余的配置,但是,当你数据的读写操作过于频繁的时候,这个方法就会略显繁琐。
fromdjango.shortcutsimportrender,HttpResponse fromapp001importmodels #Createyourviewshere. defwrite(request): models.User.objects.using('default').create(name='张三',pwd='123',phone=1234) returnHttpResponse('写成功') defread(request): obj=models.User.objects.filter(id=1).using('db2').first() returnHttpResponse('读成功')
自动读写分离
通过配置数据库路由,来自动实现读写分离,这样就不需要每次读写都手动指定数据库。
在项目的app中创建db_router.py文件,并在该文件中定义一个数据库路由类,用来进行读写分离,这个类最多提供四个方法,分别是:db_for_read、db_for_write、allow_relation、allow_migrate,以下只写了三个。
定义数据库路由类
classMasterSlaveDBRouter(object): """数据库主从读写分离路由""" defdb_for_read(self,model,**hints): """读数据库""" return"slave" defdb_for_write(self,model,**hints): """写数据库""" return"default" defallow_relation(self,obj1,obj2,**hints): """是否运行关联操作""" returnTrue
配置Router
在settings.py中指定DATABASE_ROUTERS
DATABASE_ROUTERS=["app001.db_router.MasterSlaveDBRouter"]
可以指定多个数据库路由,比如对于读操作,Django将会循环所有路由中的db_for_read()方法,直到其中一个有返回值,然后使用这个数据库进行当前操作。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。