弄完底层数据库操作模块后,接下来要做的是ORM的正式设计。在开始之前,我们需要思考一下怎么来设计一个ORM呢?这个类它能帮助我们处理什么样的问题?需要有哪些功能模块?怎么做到针对不同的数据库与表单进行操作?

  在前面我们知道,ORM它简单的理解就是将我们写的一些参数值转变为对应的sql语句,来对数据表进行增删改查的操作。它可以帮助我们整合重复的代码,让我们对数据库操作变的更加简单。也就是说,只需要将参数存储到对应的字典、列表或元组中,并将它们做为参数提交给ORM,ORM就会自动分析并处理,然后生成对应的sql语句。对于Pythoner来说,字典、列表和元组是我们最熟悉的变量,操作它们会更加的熟悉,而不是sql语句。

  那么ORM应该拥有哪些功能模块?我们可以从对数据库操作的角度进行思考,我们对数据库的操作无非就是增删改查,那么分解下来,实际上就是我们所要实现的功能了。比如说:新增记录、修改记录、删除记录、按指定条件查询、查询指定主键记录、判断记录是否存在、查询数量统计、查询指定值合计数、获取指定字段最大值、获取指定字段最小值......可以看到我们常用的查询还是挺多的,只要将它们一一实现,那么以后操作起这些功能就会变得更加的简单方便。

  而对于有多数据库时,我们只需要将ORM进行抽象创建一个ORM基类,所有的数据表操作类继承它(每个数据表我们都需要独立创建一个对应的类,它需要继承ORM基类来获取基类的所有能力),在实例化数据表操作类时,像上一章所讲到的那样通过参数注入方式处理,即不同的数据库我们注入不同的数据库连接配置,这样我们在实例化数据表操作类时,就不必考虑它到底是属于那个数据库,我们只需要知道每个表对于每个数据库来说都是唯一的,在实例化时该操作类就会进行初始化操作,然后自动载入对应的数据库配置,当对这个表进行操作时,它也会自动连接对应的数据库执行相关的操作了。(如下图)

  

  根据上面的理解,我们先创建一个ORM基类:_logic_base.py(也可以称为逻辑层父类)

  1. #!/usr/bin/env python
  2. # coding=utf-8
  3.  
  4. from common import db_helper
  5.  
  6. class LogicBase():
  7. """逻辑层基础类"""
  8.  
  9. def __init__(self, db, is_output_sql, table_name, column_name_list='*', pk_name='id'):
  10. """类初始化"""
  11. # 数据库参数
  12. self.__db = db
  13. # 是否输出执行的Sql语句到日志中,方便分析
  14. self.__is_output_sql = is_output_sql
  15. # 表名称
  16. self.__table_name = str(table_name).lower()
  17. # 查询的列字段名称,*表示查询全部字段,多于1个字段时用逗号进行分隔,除了字段名外,也可以是表达式
  18. self.__column_name_list = str(column_name_list).lower()
  19. # 主健名称
  20. self.__pk_name = str(pk_name).lower()

  子类在继承该类时,通过对__init__()进行初始化,将相关的参数注入进来,在后续执行相关操作时,就可以直接调用这些参数进行设置了。例如我们创建一个manager表对应的操作类ManagerLogic():

  1. #!/usr/bin/env python
  2. # coding=utf-8
  3.  
  4. from logic import _logic_base
  5. from config import db_config
  6.  
  7. class ManagerLogic(_logic_base.LogicBase):
  8. """用户管理表逻辑类"""
  9.  
  10. def __init__(self):
  11. # 表名称
  12. __table_name = 'manager'
  13. # 初始化
  14. _logic_base.LogicBase.__init__(self, db_config.DB, db_config.IS_OUTPUT_SQL, __table_name)

  通过from logic import _logic_base来导入父类,被ManagerLogic类所继承。

  然后导入数据库配置文件db_config。

  ManagerLogic类在执行__init__()初始化时,在第15行中绑定好该类对应的数据库(不同类可以绑定不同的配置文件,即不同的数据库),设置好IS_OUTPUT_SQL参数(是否输出所有执行的Sql语句到日志中,用于开发人员分析),以及设置该类绑定的数据表名称(通过这里绑定,在后续操作时就不会因为复制粘贴时不小时弄错表名了,当然在创建数据表子类时也要小心不要绑错表名称了)。

  column_name_list是用于查询时,如果不设置输出字段名,则会默认使用这个变量做为参数,方便有些表在操作时可以直接在这里设置好输出字段名的限制。默认值为*,表示输出所有字段内容。

  pk_name是数据表的主键名称,默认为id,对于一些不以id为默认值的,可以在这里进行设置为该表指定的主键名称。

  做好这些,ManagerLogic类就拥有了父类所有的能力(方法)了——当然需要后面将父类的功能实现后才行。

  比如父类拥有get_model()方法

  1. def get_model(self):
  2. """通过条件获取一条记录"""
  3. return '获取一条记录'

  那么我们可以写个测试用例,通过下面方式来进行调用

  1. #!/usr/bin/evn python
  2. # coding=utf-8
  3.  
  4. import unittest
  5. from logic import manager_logic
  6.  
  7. class DbHelperTest(unittest.TestCase):
  8. """数据库操作包测试类"""
  9.  
  10. def setUp(self):
  11. """初始化测试环境"""
  12. print('------ini------')
  13.  
  14. def tearDown(self):
  15. """清理测试环境"""
  16. print('------clear------')
  17.  
  18. def test(self):
  19. ##############################################
  20. # 只需要看这里,其他代码是测试用例的模板代码 #
  21. ##############################################
  22. # 实例化manager表操作类ManagerLogic
  23. _manager_logic = manager_logic.ManagerLogic()
  24. # 执行get_model()方法,获取记录实体
  25. model = _manager_logic.get_model()
  26. print(model)
  27.  
  28. ##############################################
  29.  
  30. if __name__ == '__main__':
  31. unittest.main()

  输出结果:

  1. ------ini------
  2. 获取一条记录
  3. ------clear------

  看起来是不是很简单。

版权声明:本文原创发表于 博客园,作者为 AllEmpty 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。

python开发QQ群:669058475(本群已满)、733466321(可以加2群)    作者博客:http://www.cnblogs.com/EmptyFS/

我的第一个python web开发框架(26)——定制ORM(二)的更多相关文章

  1. 我的第一个python web开发框架(41)——总结

    我的第一个python web开发框架系列博文从17年6.7月份开始写(存了近十章稿留到9月份才开始发布),到今天结束,一年多时间,想想真不容易啊. 整个过程断断续续,中间有段时间由于工作繁忙停了好长 ...

  2. 我的第一个python web开发框架(14)——后台管理系统登录功能

    接下来正式进入网站的功能开发.要完成后台管理系统登录功能,通过查看登录页面,我们可以了解到,我们需要编写验证码图片获取接口和登录处理接口,然后在登录页面的HTML上编写AJAX. 在进行接口开发之前, ...

  3. 我的第一个python web开发框架(1)——前言

    由于之前经验不是很丰富,写的C#系统太过复杂,所以一直想重写,但学的越多越觉得自己懂的越少,越觉的底气不足.所以一直不敢动手,在内心深处对自己讲,要静下心来认真学习,继续沉淀沉淀.这两年多以来找各种机 ...

  4. 我的第一个python web开发框架(3)——怎么开始?

    小白与小美公司经过几次接触商谈,好不容易将外包签订了下来,准备开始大干一场.不过小白由于没有太多的项目经验,学过python懂得python的基本语法,在公司跟着大家做过简单功能,另外还会一些HTML ...

  5. 我的第一个python web开发框架(22)——一个安全小事故

    在周末的一个早上,小白还在做着美梦,就收到了小美的连环追魂call,电话一直响个不停. 小白打着哈欠拿起电话:早上好美女. 小美:出事了出事了,我们公司网站一早访问是一片空白,什么内容都没有了,你赶急 ...

  6. 我的第一个python web开发框架(2)——一个简单的小外包

    第一部分说明 第一部分大概有20来章,主要讲的是一些开发常识.开发前中后期准备内容.开发环境与服务器部署环境安装设置.python基础框架结构与功能等内容,代码会比较简单. 本系列会以故事的方式,向大 ...

  7. 我的第一个python web开发框架(6)——第一个Hello World

    小白中午听完老菜讲的那些话后一直在思考,可想来想去还是一头雾水,晕晕呼呼的一知半解,到最后还是想不明白,心想:老大讲的太高深了,只能听懂一半半,看来只能先记下来,将明白的先做,不明白的等以后遇到再学. ...

  8. 我的第一个python web开发框架(7)——本地部署前端访问服务器

    PS:本系列内容进度节奏会放的很慢,每次知识点都尽量少一点,这样大家接触的知识点少了,会更容易理解,因为少即是多.另外,对于后面代码部分,虽然尽量不用那些复杂的封装和类,但它并不表示看了就能全部记住, ...

  9. 我的第一个python web开发框架(10)——工具函数包说明(一)

    PS:原先是想直接进入功能开发,要用到什么函数时再创建,这样也容易熟悉每个函数的由来和使用方法,但考虑到这样操作,到时会经常在不同文件间切换,不好描述,容易造成混乱,所以还是使用函数库这种方式来说明. ...

随机推荐

  1. JVM基础系列第14讲:JVM参数之GC日志配置

    说到 Java 虚拟机,不得不提的就是 Java 虚拟机的 GC(Garbage Collection)日志.而对于 GC 日志,我们不仅要学会看懂,而且要学会如何设置对应的 GC 日志参数.今天就让 ...

  2. .Net Core中的Api版本控制

    原文链接:API Versioning in .Net Core 作者:Neel Bhatt 简介 Api的版本控制是Api开发中经常遇到的问题, 在大部分中大型项目都需要使用到Api的版本控制 在本 ...

  3. PyQt:个性化登录界面模仿QQ登录

    写在前面 写了一个登录界面的demo,类似QQ的,写的自己喜欢的样式,贴一下代码,先上效果,如下 陈述 PyQt5+Python3.5.2 login.py是里登录的主界面loginWnd类,Head ...

  4. Linux~上部署.net MVC出现的问题与解决

    这几天一直在搞linux下面的.net mvc的部署工作,遇到了很多问题,还好有一些朋友的帮助,问题才得到了解决! 环境:Linux+Mono+Jexus 希望的结果:直接运行windows+vist ...

  5. mybatis注解@Param对JavaBean的作用

    当参数是一个JavaBean时,如果不用@Param且sql里获取变量用#{},如@Select("SELECT id,USERNAME,uname from uk_user where d ...

  6. 【ASP.NET Core快速入门】(十一)应用Jwtbearer Authentication、生成jwt token

    准备工作 用VSCode新建webapi项目JwtAuthSample,并打开所在文件夹项目 dotnet new webapi --name JwtAuthSample 编辑JwtAuthSampl ...

  7. Linux之数据库操作

    一.mysql基本操作 ,连接数据库 mysql -u root -p -h 127.0.0.1 mysql -u root -p -h 192.168.12.56 ,授予远程连接的权限 grant ...

  8. C#杂记-简化的初始化

    对象说明 public class Person { public int Age{get; set;} public string Name{get; set;} List<Person> ...

  9. 【Config】类库读取自己的配置文件,配置文件的扩展

    我们在项目中一般都是使用统一的项目文件配置,所有的配置和自定义的字段都写在一个web.config或者App.config文件中.一般平时我们也没有发现问题,确实这么写没有问题,但是就是如果写的多了就 ...

  10. [MySQL]select和where子句优化

    数据库优化:1.可以在单个SQL语句,整个应用程序,单个数据库服务器或多个联网数据库服务器的级别进行优化2.数据库性能取决于数据库级别的几个因素,例如表,查询和配置设置3.在数据库级别进行优化,在硬件 ...