配置多个数据库
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()