yanzhi-1996

配置多个数据库

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

数据库迁移命令:
    python manager.py migrate --database db2

读写分离

1. 手动的方式

1) 写入数据库 
use usingmodels.Student.objects.using(\'db2\').create(name=\'xxxx\')

2) 读取数据库
ret = models.Student.objects.using(\'default\').all()

3) 保存时指定数据库
for i in ret:    
	i.name = \'ran\'  # 在内存中进行修改
	i.save(using=\'default\')  # 保存在 default 数据库
1. 自动配置, 在app下创建router.py

class Router:

	# 配置读数据库
    def db_for_read(self, model, **kwargs):
        return \'default\'
	
	# 配置写数据库
    def db_for_write(self, model, **kwargs):
        return \'db2\'

2. 在settings.py配置
	DATABASE_ROUTERS = [\'app01.router.Router\']

一主多从

1. 自动配置, 在app下创建router.py

import random

class Router:

	# 配置读数据库
    def db_for_read(self, model, **kwargs):
        return random.choice([\'db1\', \'db2\', \'db3\'])
	
	# 配置写数据库
    def db_for_write(self, model, **kwargs):
        return \'default\'

2. 在settings.py配置
	DATABASE_ROUTERS = [\'app01.router.Router\']

分库分表

前提:
    app01的表放在db1
    app02的表放在db2

1. 自动配置, 在app下创建router.py

class Router:
    def db_for_read(self, model, **kwargs):
        label = model._meta.app_label

        if label == \'app01\':
            return \'db1\'
        elif label == \'app02\':
            return \'db2\'

    def db_for_write(self, model, **kwargs):
        label = model._meta.app_label

        if label == \'app01\':
            return \'db1\'
        elif label == \'app02\':
            return \'db2\'
        
2. 在settings.py配置
	DATABASE_ROUTERS = [\'app01.router.Router\']
    
3.  model._meta.app_label    # 获取app的名称
	model._meta.model_name   # 获取model类的名称

Django执行原生SQL

1. extra(): 结果集修改器,一种提供额外查询参数的机制, 依赖 model
用在where后:
	Book.objects.filter(publisher_id="1").extra(where=["title=\'python\'"])    

用在select后
	Book.objects.filter(u_id="1").extra(select={"count":"select count(*) from book"})

2. raw() 方法: 执行原始SQL并返回模型, 依赖 model 多余查询
book_obj = models.Book.objects.raw("select * from book")
for item in book_obj:
    print(item.title)
    
3. 自定义SQL, 利用游标执行, 不依赖model

from django.db import connection

cursor = connection.cursor()

# 查询
cursor.execute("select * from users")
# 插入
cursor.execute("insert into users (name) values (\'ran\')")
# 更新
cursor.execute("update users set name=\'mei\' where id=1")
# 删除
cursor.execute("delete from users where name=\'meng\'")
# 返回一行数据
raw = cursor.fetchone()
# 返回所有
raw = cursor.fetchall()

分类:

技术点:

相关文章: