Open kagxin opened 6 years ago
django 本身支持多数据库,这个为做读写分离提供了很大的便利。下面介绍基于django做数据库读写分离的方式。
DATABASES = { 'default': { # master db 使用主数据库作为默认数据库 'NAME': 'multidb', 'ENGINE': 'django.db.backends.mysql', 'USER': 'sync_user', 'PASSWORD': '****', 'HOST':'47.94.110.*' }, 'slave': { # slave db 'NAME': 'multidb', 'ENGINE': 'django.db.backends.mysql', 'USER': 'root', 'PASSWORD': '***', 'HOST':'111.231.109.*' } } DATABASE_ROUTERS = ['multidb.router.DefaultRouter'] #添加在下面实现的路由配置
这里使用主数据库作为默认数据库,在migrate的时候不指定数据库,默认在此主数据库中进行表创建和修改。
def counter(): cnt = 0 def add_one(): nonlocal cnt cnt += 1 return cnt return add_one class DefaultRouter(object): def __init__(self): self.counter = counter() def db_for_read(self, model, **hints): cnt = self.counter() # 如果存在多个从数据库,可以使用该闭包做一个简单的轮循等权路由 print('read from slave. cnt:%d'%cnt) return 'slave' def db_for_write(self, model, **hints): print('write to defalut.') return 'default' def allow_relation(self, obj1, obj2, **hints): return None def allow_migrate(self, db, app_label, model=None, **hints): return None
>>> from app.models import * >>> Person.objects.create(name='xiaoming3', age=12) # 创建对象写入到defalut master数据库 write to defalut. <Person: Person object (5)> >>> p = Person.objects.all()[0] # 从slave数据库进行查询 read from slave. cnt:1 >>> p.age 12 >>> p.age = 13 >>> p.save() #更新数据到master数据库 write to defalut. >>> p.delete() # 从master数据删除数据 write to defalut. (1, {'app.Person': 1})
由于主数据库和从数据库是存在短时的数据不同步的。 如果在特殊的业务场景下需要,就需要直接从主数据库中进行取数据。可以指定主数据库进行读取
>>> p = Person.objects.using('default').all()[0] #可以使用using直接指定数据进行操作 >>> p.age 18
>>> from django.db import connections >>> cursor = connections['default'].cursor() # 选择defalut数据库,进行操作 >>> cursor.execute('select * from person limit 3') 3 >>> cursor.fetchall() ((3, 'xiaogang', 18), (4, 'xiaogang', 18), (5, 'xiaoming3', 12))
ref : https://docs.djangoproject.com/en/2.0/topics/db/multi-db/ 示例工程: https://github.com/kagxin/recipes/tree/master/multidb
可以看到增删改是在master数据库中进行的
查询是从主数据库中进行查询的 这一句 错了吧
django 多数据库支持
django 本身支持多数据库,这个为做读写分离提供了很大的便利。下面介绍基于django做数据库读写分离的方式。
默认前提
在setting中进行多数据库配置
这里使用主数据库作为默认数据库,在migrate的时候不指定数据库,默认在此主数据库中进行表创建和修改。
路由配置
使用
特殊需求
由于主数据库和从数据库是存在短时的数据不同步的。 如果在特殊的业务场景下需要,就需要直接从主数据库中进行取数据。可以指定主数据库进行读取
使用原生原始
ref : https://docs.djangoproject.com/en/2.0/topics/db/multi-db/ 示例工程: https://github.com/kagxin/recipes/tree/master/multidb