我的第一个python web开发框架(26)——定制ORM(二)
弄完底层数据库操作模块后,接下来要做的是ORM的正式设计。在开始之前,我们需要思考一下怎么来设计一个ORM呢?这个类它能帮助我们处理什么样的问题?需要有哪些功能模块?怎么做到针对不同的数据库与表单进行操作?
在前面我们知道,ORM它简单的理解就是将我们写的一些参数值转变为对应的sql语句,来对数据表进行增删改查的操作。它可以帮助我们整合重复的代码,让我们对数据库操作变的更加简单。也就是说,只需要将参数存储到对应的字典、列表或元组中,并将它们做为参数提交给ORM,ORM就会自动分析并处理,然后生成对应的sql语句。对于Pythoner来说,字典、列表和元组是我们最熟悉的变量,操作它们会更加的熟悉,而不是sql语句。
那么ORM应该拥有哪些功能模块?我们可以从对数据库操作的角度进行思考,我们对数据库的操作无非就是增删改查,那么分解下来,实际上就是我们所要实现的功能了。比如说:新增记录、修改记录、删除记录、按指定条件查询、查询指定主键记录、判断记录是否存在、查询数量统计、查询指定值合计数、获取指定字段最大值、获取指定字段最小值......可以看到我们常用的查询还是挺多的,只要将它们一一实现,那么以后操作起这些功能就会变得更加的简单方便。
而对于有多数据库时,我们只需要将ORM进行抽象创建一个ORM基类,所有的数据表操作类继承它(每个数据表我们都需要独立创建一个对应的类,它需要继承ORM基类来获取基类的所有能力),在实例化数据表操作类时,像上一章所讲到的那样通过参数注入方式处理,即不同的数据库我们注入不同的数据库连接配置,这样我们在实例化数据表操作类时,就不必考虑它到底是属于那个数据库,我们只需要知道每个表对于每个数据库来说都是唯一的,在实例化时该操作类就会进行初始化操作,然后自动载入对应的数据库配置,当对这个表进行操作时,它也会自动连接对应的数据库执行相关的操作了。(如下图)

根据上面的理解,我们先创建一个ORM基类:_logic_base.py(也可以称为逻辑层父类)
#!/usr/bin/env python
# coding=utf-8 from common import db_helper class LogicBase():
"""逻辑层基础类""" def __init__(self, db, is_output_sql, table_name, column_name_list='*', pk_name='id'):
"""类初始化"""
# 数据库参数
self.__db = db
# 是否输出执行的Sql语句到日志中,方便分析
self.__is_output_sql = is_output_sql
# 表名称
self.__table_name = str(table_name).lower()
# 查询的列字段名称,*表示查询全部字段,多于1个字段时用逗号进行分隔,除了字段名外,也可以是表达式
self.__column_name_list = str(column_name_list).lower()
# 主健名称
self.__pk_name = str(pk_name).lower()
子类在继承该类时,通过对__init__()进行初始化,将相关的参数注入进来,在后续执行相关操作时,就可以直接调用这些参数进行设置了。例如我们创建一个manager表对应的操作类ManagerLogic():
#!/usr/bin/env python
# coding=utf-8 from logic import _logic_base
from config import db_config class ManagerLogic(_logic_base.LogicBase):
"""用户管理表逻辑类""" def __init__(self):
# 表名称
__table_name = 'manager'
# 初始化
_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()方法
def get_model(self):
"""通过条件获取一条记录"""
return '获取一条记录'
那么我们可以写个测试用例,通过下面方式来进行调用
#!/usr/bin/evn python
# coding=utf-8 import unittest
from logic import manager_logic class DbHelperTest(unittest.TestCase):
"""数据库操作包测试类""" def setUp(self):
"""初始化测试环境"""
print('------ini------') def tearDown(self):
"""清理测试环境"""
print('------clear------') def test(self):
##############################################
# 只需要看这里,其他代码是测试用例的模板代码 #
##############################################
# 实例化manager表操作类ManagerLogic
_manager_logic = manager_logic.ManagerLogic()
# 执行get_model()方法,获取记录实体
model = _manager_logic.get_model()
print(model) ############################################## if __name__ == '__main__':
unittest.main()
输出结果:
------ini------
获取一条记录
------clear------
看起来是不是很简单。
版权声明:本文原创发表于 博客园,作者为 AllEmpty 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
python开发QQ群:669058475(本群已满)、733466321(可以加2群) 作者博客:http://www.cnblogs.com/EmptyFS/
我的第一个python web开发框架(26)——定制ORM(二)的更多相关文章
- 我的第一个python web开发框架(41)——总结
我的第一个python web开发框架系列博文从17年6.7月份开始写(存了近十章稿留到9月份才开始发布),到今天结束,一年多时间,想想真不容易啊. 整个过程断断续续,中间有段时间由于工作繁忙停了好长 ...
- 我的第一个python web开发框架(14)——后台管理系统登录功能
接下来正式进入网站的功能开发.要完成后台管理系统登录功能,通过查看登录页面,我们可以了解到,我们需要编写验证码图片获取接口和登录处理接口,然后在登录页面的HTML上编写AJAX. 在进行接口开发之前, ...
- 我的第一个python web开发框架(1)——前言
由于之前经验不是很丰富,写的C#系统太过复杂,所以一直想重写,但学的越多越觉得自己懂的越少,越觉的底气不足.所以一直不敢动手,在内心深处对自己讲,要静下心来认真学习,继续沉淀沉淀.这两年多以来找各种机 ...
- 我的第一个python web开发框架(3)——怎么开始?
小白与小美公司经过几次接触商谈,好不容易将外包签订了下来,准备开始大干一场.不过小白由于没有太多的项目经验,学过python懂得python的基本语法,在公司跟着大家做过简单功能,另外还会一些HTML ...
- 我的第一个python web开发框架(22)——一个安全小事故
在周末的一个早上,小白还在做着美梦,就收到了小美的连环追魂call,电话一直响个不停. 小白打着哈欠拿起电话:早上好美女. 小美:出事了出事了,我们公司网站一早访问是一片空白,什么内容都没有了,你赶急 ...
- 我的第一个python web开发框架(2)——一个简单的小外包
第一部分说明 第一部分大概有20来章,主要讲的是一些开发常识.开发前中后期准备内容.开发环境与服务器部署环境安装设置.python基础框架结构与功能等内容,代码会比较简单. 本系列会以故事的方式,向大 ...
- 我的第一个python web开发框架(6)——第一个Hello World
小白中午听完老菜讲的那些话后一直在思考,可想来想去还是一头雾水,晕晕呼呼的一知半解,到最后还是想不明白,心想:老大讲的太高深了,只能听懂一半半,看来只能先记下来,将明白的先做,不明白的等以后遇到再学. ...
- 我的第一个python web开发框架(7)——本地部署前端访问服务器
PS:本系列内容进度节奏会放的很慢,每次知识点都尽量少一点,这样大家接触的知识点少了,会更容易理解,因为少即是多.另外,对于后面代码部分,虽然尽量不用那些复杂的封装和类,但它并不表示看了就能全部记住, ...
- 我的第一个python web开发框架(10)——工具函数包说明(一)
PS:原先是想直接进入功能开发,要用到什么函数时再创建,这样也容易熟悉每个函数的由来和使用方法,但考虑到这样操作,到时会经常在不同文件间切换,不好描述,容易造成混乱,所以还是使用函数库这种方式来说明. ...
随机推荐
- BBS论坛(二)
2.1.cms后台登录界面完成 (1)templates/cms/cms_login.html <!DOCTYPE html> <html lang="zh-CN" ...
- css实现超出文本省略号的两个方法
方法一:适用于定宽高; <!DOCTYPE html> <html> <head lang="en"> <meta charset=&qu ...
- .NET Core实战项目之CMS 第十六章 用户登录及验证码功能实现
前面为了方便我们只是简单实现了基本业务功能的增删改查,但是登录功能还没有实现,而登录又是系统所必须的,得益于 ASP.NET Core的可扩展性因此我们很容易实现我们的登录功能.今天我将带着大家一起来 ...
- java算法(1)---余弦相似度计算字符串相似率
余弦相似度计算字符串相似率 功能需求:最近在做通过爬虫技术去爬取各大相关网站的新闻,储存到公司数据中.这里面就有一个技术点,就是如何保证你已爬取的新闻,再有相似的新闻 或者一样的新闻,那就不存储到数据 ...
- 说一说MVC的Authentication过滤(四)
前沿: 一般情况下,在我们做访问权限管理的时候,会把用户的正确登录后的基本信息保存在Session中,以后用户每次请求页面或接口数据的时候,拿到 Session中存储的用户基本信息,查看比较他有没有登 ...
- C#操作进程(Process)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- MVC从Controller到View的呈现
图说MVC底层运行机制: 当路由机制已经激活Controller并InvokeAction后,如果返回的是View, 则ViewResult基于View呈现的请求响应机制内部借助MVC提供的View引 ...
- 【链表问题】打卡2:删除单链表的第 K个节点
前言 以专题的形式更新刷题贴,欢迎跟我一起学习刷题.每道题会提供简单的解答. 题目描述 在单链表中删除倒数第 K 个节点 要求 如果链表的长度为 N, 时间复杂度达到 O(N), 额外空间复杂度达到 ...
- 配置最新版LAMP环境
本篇文章讲解的是在centos7.3下配置 Apache2.4 + MySQL5.7 + PHP7.1.8 (如果是Nginx请跳过Apache流程继续往下看,所有流程本人已临床验证无数遍,绝无问题) ...
- glusterfs+heketi为k8s提供共享存储
背景 近来在研究k8s,学习到pv.pvc .storageclass的时候,自己捣腾的时候使用nfs手工提供pv的方式,看到官方文档大量文档都是使用storageclass来定义一个后端存储服务, ...