个人第一个python web开发框架(26)——定制ORM(二)

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

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

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

  而对于有多数据库时,咱们只须要将ORM进行抽象建立一个ORM基类,全部的数据表操做类继承它(每一个数据表咱们都须要独立建立一个对应的类,它须要继承ORM基类来获取基类的全部能力),在实例化数据表操做类时,像上一章所讲到的那样经过参数注入方式处理,即不一样的数据库咱们注入不一样的数据库链接配置,这样咱们在实例化数据表操做类时,就没必要考虑它究竟是属于那个数据库,咱们只须要知道每一个表对于每一个数据库来讲都是惟一的,在实例化时该操做类就会进行初始化操做,而后自动载入对应的数据库配置,当对这个表进行操做时,它也会自动链接对应的数据库执行相关的操做了。(以下图)测试

  

  根据上面的理解,咱们先建立一个ORM基类:_logic_base.py(也能够称为逻辑层父类)spa

 

#!/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():设计

 

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

 

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

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

  ManagerLogic类在执行__init__()初始化时,在第15行中绑定好该类对应的数据库(不一样类能够绑定不一样的配置文件,即不一样的数据库),设置好IS_OUTPUT_SQL参数(是否输出全部执行的Sql语句到日志中,用于开发人员分析),以及设置该类绑定的数据表名称(经过这里绑定,在后续操做时就不会由于复制粘贴时不小时弄错表名了,固然在建立数据表子类时也要当心不要绑错表名称了)。blog

  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/

相关文章
相关标签/搜索