一, Django 的数据库配置
(一) 修改 settings.py 文件关于数据库的配置:
Django 默认使用 SQLite:
- # Django 默认的数据库库, SQLit 配置
- DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.sqlite3', # SQLite 引擎
- 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
- }
- }
再添加一个数据库: 仿照 "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'),
- },
- }
注意: 如果想要使用 MySQL, 需要进行一下配置:
1. 编辑项目文件夹下的 settings.py
- DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.mysql', # MySQL 引擎
- 'NAME': 'BookManagement',
- # 数据库名称, 需要通过命令'CREATE DATABASE BookManagement'在 MySQL 命令窗口中提前创建
- 'USER': 'root', # 数据库用户名
- 'PASSWORD': 'xxx', # 数据库密码 没有密码则为空字符串
- 'HOST': '', # 数据库主机, 留空默认为 localhost
- 'PORT': '3306', # 数据库端口
- }
- }
2. 编辑项目文件夹下的__init__.py : 由于 MySQL 在 Django 中默认驱动是 MySQLdb, 而该驱动不适用于 python3, 因此, 我们需要更改驱动为 PyMySQL
- # 代码实现:
- import pymysql
- pymysql.install_as_MySQLdb()
3. 显示 SQL 语句 , 前面我们说了 ORM 是高层的面向对象的操作, 转换为低层的 SQL 语句, 如果想在终端打印对应的 SQL 语句, 可以在 setting.py 中加上日志记录
代码实现:
- LOGGING = {
- 'version': 1,
- 'disable_existing_loggers': False,
- 'handlers': {
- 'console':{
- 'level':'DEBUG',
- 'class':'logging.StreamHandler',
- },
- },
- 'loggers': {
- 'django.db.backends': {
- 'handlers': ['console'],
- 'propagate': True,
- 'level':'DEBUG',
- },
- }
- }
(二), 修改好数据库配置之后, 在 models.py 文件里创建表, 之后进行数据库迁移工作:
- python manage.py makemigrations # 在 migrations 文件夹下生成记录, 迁移前检查
- python manage.py migrate # 真正执行数据库迁移命令, 该命令执行之后创建表
二, 读写分离
(一) 手动读写分离
1. 在使用数据库时, 通过. using(db_name) 来手动指定要使用的数据库
优点: 不需要进行其余的配置, 只需要通过. using(db_name) 来手动指定要使用的数据库就行.
缺点: 在大量的对数据库进行操作之后, 此种方法繁琐
- # 代码实现
- from django.shortcuts import HttpResponse
- from . import models
- def write(request):
- models.Products.objects.using('default').create(prod_name='熊猫公仔', prod_price=12.99)
- return HttpResponse('写入成功')
- def read(request):
- obj = models.Products.objects.filter(id=1).using('db2').first()
- return HttpResponse(obj.prod_name)
(二) 自动读写分离
通过配置数据库路由, 来自动实现, 这样就不需要每次读写都手动指定数据库了. 数据库路由中提供了四个方法. 这里这里主要用其中的两个: def db_for_read() 决定读操作的数据库, def db_for_write() 决定写操作的数据库.
定义 Router 类
新建 myrouter.py 脚本, 定义 Router 类:
- class Router:
- def db_for_read(self, model, **hints):
- return 'db2'
- def db_for_write(self, model, **hints):
- return 'default'
配置 Router
在 settings.py 中指定 DATABASE_ROUTERS
DATABASE_ROUTERS = ['myrouter.Router',]
一主多从方案
网站的读的性能通常更重要, 因此, 可以多配置几个数据库, 并在读取时, 随机选取, 比如:
- class Router:
- def db_for_read(self, model, **hints):
- """
- 读取时随机选择一个数据库
- """
- import random
- return random.choice(['db2', 'db3', 'db4'])
- def db_for_write(self, model, **hints):
- """
- 写入时选择主库
- """ return'default'
分库分表
在大型 web 项目中, 常常会创建多个 App 来处理不同的业务, 如果希望实现 App 之间的数据库分离, 比如 app01 走数据库 db1,app02 走数据库
- class Router:
- def db_for_read(self, model, **hints):
- if model._meta.app_label == 'app01':
- return 'db1'
- if model._meta.app_label == 'app02':
- return 'db2'
- def db_for_write(self, model, **hints):
- if model._meta.app_label == 'app01':
- return 'db1'
- if model._meta.app_label == 'app02':
参考博客: 点这里
default
来源: http://www.bubuko.com/infodetail-2822264.html