如何使用Python实现一个简易的ORM模型 您所在的位置:网站首页 python数据库框架orm 如何使用Python实现一个简易的ORM模型

如何使用Python实现一个简易的ORM模型

2023-04-07 21:35| 来源: 网络整理| 查看: 265

ORM框架想必小伙伴们都不陌生,著名的Django就是ORM框架的一个经典案例。那么这个框架是如何实现的呢?今天我们就使用python实现一个简易的ORM模型,通过这个过程来学习ORM框架的相关知识。

使用到的知识

1、元类

2、描述器

元类

对于元类,我的理解其实也便较浅,大概是这个意思

所有的类都是使用元类来进行创建的,而所有的类的父类中必然是object(针对Python3),Python中的元类只有一个(type),当然这里不包含自定义元类

下面我们来看下类的创建

class Test: # 定义一个类 pass Test1 = type("Test2",(object,),{"name":"test"}) # 定义一个类 print(type(Test)) print(type(Test1))-----------------------

从上面可以看出创建类,其实是有两种方式,一种是通过class关键字来定义,一种是通过type来进行创建,当然常用的是使用class来进行创建了,在看最后的结果,可以看出类的类型为type。说明我们这个类就是由type来创建的

明白了这个之后我们再来梳理下怎么使用自定义元类来创建类,明白一点,自定义元类需要继承type

class MetaClass(type): # 定义一个元类 pass class Test(metaclass=MetaClass): # 使用自定义元类来创建类 pass print(type(Test)) --------------------------

很明显可以看出Test类就是用MetaClass类创建出来的

描述器

从描述器的定义来说,只要一个类中实现了__get__、__set__、__delete__中的一个或几个,这个类的实例就可以叫描述器

下面我们来定义一个简易的描述器

class Describer: def __set__(self, instance, value): print("设置属性的时候会被调用") self.value = value def __get__(self, instance, owner): print("获取属性的时候会被调用") return self.value def __delete__(self, instance): print("删除属性的时候会被调用") self.value = None class Test: name = Describer() t = Test() t.name = "xxxxx" print(t.name) ---------------------- 设置属性的时候会被调用 获取属性的时候会被调用 xxxxx

从上面的代码中有没有什么想法?既然__set__方法会在我们设置属性的时候会被调用,那么我们是不是可以在设置属性前对这个属性做一些操作呢?

ORM模型

ORM模型到底是个啥?ORM对于后端研发来说肯定是不陌生的,包括很多后端框架现在都自带这个模型了

ORM(Object Relational Mapping)对象关系映射

既然是对象关系映射,那对象是啥?我的理解为:Python中的类与数据库之间的映射,对数据的操作就不用编写SQL语言了,因为都封装好了,比如你想插入一条数据,你就直接创建一个对象即可,

Python ------->>>>      数据库

类名     ------->>>>      数据库中的表名

对象     ------->>>>      数据库中的一行数据

属性     ------->>>>      数据库中的字段

大致就是上面的映射关系

ORM实现步骤

1、利用描述器实现对数据库字段的类型、长度限制

2、实现Mode类,也就是Python中的类

3、利用元类实现映射关系

好,我们先利用描述器来实现对数据字段的类型,长度限制

class BaseFiled: pass class CharFiled(BaseFiled): """定义一个字符串的类型限制""" def __init__(self, length=10): self.length = length def __set__(self, instance, value): if isinstance(value, str): if len(value)


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有