数据库分库分表,读写分离

不同的APP可以使用不同的数据库,读写操作可以分库使用不同的表,一种是可以在代码层面使用using进程控制,还可以自定义一个router类,写一个db_for_read和db_for_write方法,在settings里面配置一下,以后读与写都会连接到指定的表中

分表:当单个表中的数据太多,会导致查询的效率越来越低,可以将表按水平拆分或垂直拆封后建立一对一的关联关系,然后到不同的表中查询数据

读写分离

python manage.py makemigraions
python manage.py migrate app名称 --databse=配置文件数据名称的别名

手动操作:
models.UserType.objects.using('db1').create(title='普通用户')
result = models.UserType.objects.all().using('default')

自动操作:
class Router1:
def db_for_read(self, model, **hints):
"""
Attempts to read auth models go to auth_db.
"""
return 'db1'

def db_for_write(self, model, **hints):
"""
Attempts to write auth models go to auth_db.
"""
return 'default'

配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
},
'db1': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db1.sqlite3'),
},
}
DATABASE_ROUTERS = ['db_router.Router1',]

使用:
models.UserType.objects.create(title='VVIP')

result = models.UserType.objects.all()
print(result)

-粒度更细,指定某个定写到哪个数据库,从哪个数据库读
class Router1:
def db_for_read(self, model, **hints):
"""
Attempts to read auth models go to auth_db.
"""
if model._meta.model_name == 'usertype':
return 'db1'
else:
return 'default'

def db_for_write(self, model, **hints):
"""
Attempts to write auth models go to auth_db.
"""
return 'default'


分库

不同app放到不同库中
app01中的表在default数据库创建
app02中的表在db1数据库创建

# 第一步:
python manage.py makemigraions

# 第二步:
app01中的表在default数据库创建
python manage.py migrate app01 --database=default

# 第三步:
app02中的表在db1数据库创建
python manage.py migrate app02 --database=db1

# 手动操作:
m1.UserType.objects.using('default').create(title='VVIP')
m2.Users.objects.using('db1').create(name='VVIP',email='xxx')
# 自动操作:
配置:
class Router1:
def db_for_read(self, model, **hints):
"""
Attempts to read auth models go to auth_db.
"""
if model._meta.app_label == 'app01':
return 'default'
else:
return 'db1'

def db_for_write(self, model, **hints):
"""
Attempts to write auth models go to auth_db.
"""
if model._meta.app_label == 'app01':
return 'default'
else:
return 'db1'

DATABASE_ROUTERS = ['db_router.Router1',]

使用:
m1.UserType.objects.using('default').create(title='VVIP')
m2.Users.objects.using('db1').create(name='VVIP',email='xxx')
-数据库迁移时进行约束:
class Router1:
def allow_migrate(self, db, app_label, model_name=None, **hints):
#python manage.py migrate app02 --database=db1
# app_label=app02 db=db1
if db=='db1' and app_label == 'app02':
return True
elif db == 'default' and app_label == 'app01':
return True
else:
return False

# 如果返回None,那么表示交给后续的router,如果后续没有router,则相当于返回True

def db_for_read(self, model, **hints):
"""
Attempts to read auth models go to auth_db.
"""
if model._meta.app_label == 'app01':
return 'default'
else:
return 'db1'

def db_for_write(self, model, **hints):
"""
Attempts to write auth models go to auth_db.
"""
if model._meta.app_label == 'app01':
return 'default'
else:
return 'db1'

posted @ 2019-03-03 15:13  liweiwei0307  阅读(401)  评论(0编辑  收藏  举报