当前位置:数据分析 > Python 手写ORM-我的一个数据库访问工具(一)

Python 手写ORM-我的一个数据库访问工具(一)

  • 发布:2023-09-27 06:07

ORM框架的存在意义

一.什么是ORM框架

对象-关系映射(Object-Relational Mapping,简称ORM),面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。

二.为什么要使用ORM框架

ORM框架可以化解SQL语句的复杂性,对数据库访问进行对象化,可以减少程序的代码量,并且能大大减少重复性代码

手写我的第一个ORM框架

ef-for-python和使用

学过.NET语言的同学都知道在.NET平台下基于LINQ的EntityFramework的ORM框架吧,而本次教程就是在python中复现一下ef框架

用例及其代码与包的引用

因为我们的测试环境是在MySQL下的,所以要引入MySQL的包

import pymysql
然后要引入写好的DBContext包
from DBContext import *

表的构造
name:tb_user

字段名类型
Namenchar(10)主键
Ageint

然后我们要编写我们的上下文类(DataBase First)

class DB_TestContext(DBContext):def __init__(self):con = pymysql.connect(host='local', user='nn', password='nn', db='dbtest')super().__init__(con)self.tb_user = DBSet('tb_user', self.create())

然后我们实例化上下文,并查询数据

context = DB_TestContext()
result = context.tb_user.select()
print(len(result))

因为数据库中没有数据,所有结果为

然后我们要增加一条新数据

context = DB_TestContext()user = context.tb_user.model()
user.Name = 'TestUser'
user.Age = 20context.tb_user.add(user)
context.savechanges()

该orm框架下,对于模型类已经动态生成了,通过[DBSet].model()即可获取实例化对象
然后我们再查询一下结果

context = DB_TestContext()
result = context.tb_user.select().firstordefault()
print(result.Name, result.Age)


我们对增加几条数据,然后使用lambda查询

context = DB_TestContext()result = context.tb_user.select()
for i in result:print(i.Name, i.Age)

已经全部插入进数据库了

使用where子句查询Age>15的用户

context = DB_TestContext()result = context.tb_user.where(lambda x: x.Age > 15)
for i in result:print(i.Name, i.Age)


修改TestUser的用户名为NewUser

context = DB_TestContext()result = context.tb_user.find('TestUser')
result.Name = 'NewUser'context.savechanges()

再次查询

context = DB_TestContext()result = context.tb_user.where(lambda x: x.Age > 15)
for i in result:print(i.Name, i.Age)

已经完全能修改掉原数据了

删除NewUser,再次打印数据

context = DB_TestContext()result = context.tb_user.where(lambda x: x.Name == 'NewUser').firstordefault()
if result is not None:context.tb_user.remove(result)
context.savechanges()

(该段查询代码查询的是Age>15的)

对于where子句,find子句,firstordefault子句的使用
where子句是lambda映射,返回值为True,用于查询数据库中符合的数据,并以Collection对象的方式返回结果,而firstordefault是Collection类函数,用于返回集合中第一个元素,如果不存在,返回default值,默认为None
具体的请移步至.NET的ICollection的拓展用法,而该项目因为是仿造的ef的语法,查询语句等请移步EntityFramework查询C# EF Core可视化工具的使用以及EF Core入门语句

效率测试

该项目目前似乎没有多高的效率,反倒很低,是以后优化的重点

测试项目使用时间
10000条数据生成并插入6’57.96
10000条数据中查询0’00.57

该框架改进的地方有,但是也能正常使用,后面的教程就是框架的构建,欢迎订阅

相关文章