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

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 = 20

context.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

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

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纸墨青鸢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值