一 Django的数据库配置
(一)修改settings.py文件关于数据库的配置:
Django默认使用sqlite:
DATABASES =
{
'
default
'
: {
'
ENGINE
':
'
django.db.backends.sqlite3
'
, # sqlite引擎
'
NAME
': os.path.join(BASE_DIR,
'
db.sqlite3
'
),
}
}
再添加一个数据库:
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,则进行如
DATABASES =
{
'
default
'
: {
'
ENGINE
':
'
django.db.backends.mysql
'
, # mysql引擎
'
NAME
':
''
, # 数据库名称,
'
USER
':
'
root
'
, # 数据库用户名
'
PASSWORD
':
'
xxx
'
, # 数据库密码 没有密码则为空字符串
'
HOST
':
''
, # 数据库主机,留空默认为localhost
'
PORT
':
'
3306
'
, # 数据库端口
}
}
如果是在Windows下进行开发需要在项目文件下的__init__.py中配置
import pymysql pymysql.install_as_MySQLdb()
显示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 # 真正执行数据库迁移命令,该命令执行之后创建表 python mange.py migrate--database db2 #同时将数据同步到db2数据库中
二、读写分离
(一)手动读写分离
在使用数据库时,通过.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)
(二)自动读写分离
通过配置数据库路由,来自动实现,这样就不需要每次读写都手动指定数据库了。数据库路由中提供了四个方法。这里这里主要用其中的两个: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
':
return 'db2'