Fork me on GitHub

Django:实现读写分离

库的配置

1.读写分离

  • settings配置
#settings.py 配置库信息,生成2个库

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

python3 manage.py makemigrations   #生成迁移文件
python3 manage.py migrate --database db2 #db2数据库迁移


  • 手动操作
ret = model.Student.objects.all().using('db2')#查询db2库所有数据

models.Student.object.using("default").create(name='xxoo')#往default库写入信息

#db2查询name='ss',并更改name,并保存在default库中
obj = models.Stundet.objects.using('db2').get(name='ss')
obj.name = "sha"
obj.save(using="default")
  • 自动操作
#myrouter.py

class Router:
	def db_for_write(self,model,**kwargs):
		return "db2"

	def db_for_read(self,model,**kwargs):
		return "default"
#settings.py配置
DATABASE_ROUTERS=['myrouter.Router',]

2.一主多从

#myrouter.py

class Router:
	def db_for_write(self,model,**kwargs):
		return "default"

	def db_for_read(self,model,**kwargs):
		return random.choice(['db2','db3',"db4"])
#settings.py配置
DATABASE_ROUTERS=['myrouter.Router',]

3.分库分表

  • 分库:
#settings.py配置
#myrouter.py
class Router:
    """
    app01   model  db1
    app02   model  db2
    """
	def db_for_write(self,model,**kwargs):
         app_name = model._meta.app_label#此操作能获得app的名字
         if app_name == "app01":
            return "db1"
        elif app_name == "app02":
			return "app02"

	def db_for_read(self,model,**kwargs):
		app_name = model._meta.app_label#此操作能获得app的名字
        if app_name == "app01":
            return "db1"
        elif app_name == "app02":
			return "app02"

4.Django执行原生SQL

  • 单起一个文件
import os
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "temp.settings")
djnago.setup()
#以上配置django环境

#extra方法:
from app01 import models
#从Student,找id大于1的对象值
ret = models.Student.object.all().extra(where=['id>%s'],params=['1']).values()
print(ret)

#raw方法:
ret = models.Student.objects.raw('select * from main.app01_classes')
print(ret)
for i in ret:
    print(i)#拿到学生对象
#connection方法:
from django.db import connections
#cursor = connections.cursor()
cursor = connections['db2'].cursor()#指向db2库
cursor.execute("""select * from main.app_classes where id=%s""",[1,])
row = cursor.fetchall()
print(row)
posted @   是阿凯啊  阅读(191)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示