django - 多数据库及分库实现
来源:互联网 发布:java park wait 区别 编辑:程序博客网 时间:2024/05/24 01:25
定义及路由机制
定义
路由注册
User1Router的路由逻辑是,如果model所属的app是auth的话,就使用user1数据库,否则就使用其他的;User2Router的逻辑类似。
如何注册路由
光定义路由程序无法调用到,还需要注册到django中,在settings中定义
DATABASE_ROUTERS = ['path.to.User1Router' , 'path.to.User2Router']
path.to:是User1Router的完整python包路径,所以,User1Router不一定要在settings中实现,可以在任何地方。
路由机制
那么django是如何选择其中一个路由的呢?
1. django按照注册的顺序轮询DATABASE_ROUTERS,所以首先验证User1Router是否返回了非空字符串,如果是,则使用User1Router;如果不是则接着验证后面的Router;
2. 同样验证User2Router,如果User2Router返回了非空字符串,则使用User2Router;如果不是则使用default数据库;
3. 所以可以看出,路由注册的顺序是会影响最后的结果的,注册在前面的路由会优先被使用;
自动路由和手动路由
上面定义的Router是自动路由,意思是django会自动轮询所注册的路由器,某个model会保存在哪个数据库,是django通过注册的Router自动获得的,在编码中你不需要指定;
手动路由,则是你可以在编码中指定某个model要保存到哪个数据库。
而且手动路由也有性能方面的优点,如果定义了很多个数据库,每次保存或者读取model都要把轮询一遍路由列表,显然效率有些低,如果程序逻辑清楚的知道当前的代码应该连接哪个数据库,显示指定的方式显然效率更高。
手动路由
查询
保存或者更新
删除
分库技术
垂直分库
即一个app对应一个数据库,上面自动路由的例子就是一个垂直分库的例子,auth1使用user1数据库,auth2使用user2数据库。当然也可以使用手动路由。
水平分库
水平分库建议使用手动路由,因为每个model的分库机制可能都不一样,自动路由实现起来有些麻烦会造成性能不高,而手动路由,每个model根据自己的规则来获得不同的数据库。
- django - 多数据库及分库实现
- django 多数据库
- django 多数据库
- Django的多数据库的处理(垂直分库和水平分库)
- django多数据库事务处理
- Django 多数据库联用
- django多数据库联用
- django 多数据库配置
- Django使用多数据库
- Django 多数据库 + mysql + wsgi + apache
- Django 连接多数据库 配置
- 多对多数据库创建方式Django
- 抽象工厂实现多数据库连接
- bbossgroups实现多数据库事务
- Spring + Hibernate 实现多数据库链接
- mybatis多数据库动态切换实现
- bboss持久层多数据源配置及多数据库事务控制使用方法
- django 1.8 官方文档翻译: 2-5-6 多数据库
- [大规模并行处理器编程实战]读书笔记_Heterogeneous Parallel Programming_CHAPTER_03
- C++:静态成员函数,静态数据成员,成员函数存储方式
- Java Serializable(序列化)的总结
- BZOJ 1057 ZJOI 2007 棋盘制作 DP+悬线法
- leetcode:Remove Nth Node From End of List
- django - 多数据库及分库实现
- 占位
- 占位
- 占位
- 占位
- 占位
- 从CommonJS vs AMD中解读JavaScript依赖管理
- 占位
- 两个通用的产生一个编号字段的思路