设为首页 收藏本站
查看: 1134|回复: 0

[经验分享] Django源代码阅读分析-2:持久层结构分析

[复制链接]

尚未签到

发表于 2016-11-22 10:17:13 | 显示全部楼层 |阅读模式
  声明:本文为转载
  Django对持久层的封装得很好,很好地支持Mysql、PostgreSQL、Oracle、SQLite3等流行的关系型数据库。顶层提供统一的模型封装,使用者基本无须关心真实数据库底层的细节,甚至对DBMS本身知之甚少也没关系。
  Django做到这点的的方法之一是进行了抽象和封装。不再对外暴露SQL语句本身,甚至连具体DBMS也以统一的界面为使用者做了隔离,用户看到的只有同一的Model模型,或者一些命令行Command,这些Model或Command与实际DBMS的沟通,都被封装到了经过高度抽象的Backend模块中。如下图所示为Django持久层模型概览:
DSC0000.png

  Django对持久层的封装的python模块写在Django.Db.Backends包中,其下的每一个包对应一种具体的数据库类型,上面所提到的MySQL、SQLite等就是以包的形式存在于Django.Db.Backends下的。以MySQL为例我整理了一下其类层次结构。画类图的过程中发现,对python的建模和Java不同,因为python中一个模块中可以有多个类结构,还可以有一些面向过程的语句。而Java中一般都是一个文件一个类(当然,内部类除外),建模的时候很容易使用类图表达。
  基于“抽象”的思维,Django为它所支持的底层数据库类型提供了一致的接口,但这个接口并非其下所有接口的共有操作,而是提供了底下所有操作的一个超集。例如,对于DatabasseOperations类的方法,在SQLite3中有convert_values()方法,在Mysql的操作中是没有此方法的;但在Mysql中又有value_to_db_datetime()和value_to_db_time()等SQLite3所没有的操作。而这些操作在其父类BaseDatabaseOperations中都有。
  以MySQL为例,画了Backends内部类图之间的关系,细节如下图所示,其实对于其他的数据库实现的支持,也是差不多的。
DSC0001.png

  模型最原始的调用在最顶层的__init__.py中。load_backends()方法会根据settings.py中的配置项import对应的DB驱动和backend模块。有一个比较巧而且也算典型的python代码写法,在db.__init__.py的load_backend(backend_name)函数中:
  改语句是出现导入backend异常的时候出现的,当然后不被支持的数据库后端时,系统找不到对应的backend实例,就会抛出异常,同时会把目前已被支持的数据库列举一遍,列举是通过扫描Django/Db/Backends目录下的文件完成的(前面说过,每一种实际被支持的数据库后端,都必须在Backends目录下建立子目录然后在其中继承实现第二幅图中蓝色的几个基类),如果该文件f是一个子目录,并且目录名不是"."开头的,则把这些目录名合并成一个列表返回赋值给available_backends变量。这是一个完整语句所完成的功能,相比于Java代码,十分简洁。
available_backends = [f for f in os.listdir(backend_dir) \
        if os.path.isdir(os.path.join(backend_dir, f))  \
        and not f.startswith('.')]
  至于更细节的数据库封装实现,可以以MySQL为例参考Django源代码,源代码树的位置是Django/Db/Backends/Mysql。
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-303913-1-1.html 上篇帖子: android连接SQLite数据库-----增加改查+分页 下篇帖子: NHibernate从入门到精通系列(2)——NHibernate环境与结构体系
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表