对象-关系映射(Object-Relational Mapping,简称ORM),面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。
ORM框架可以化解SQL语句的复杂性,对数据库访问进行对象化,可以减少程序的代码量,并且能大大减少重复性代码
学过.NET语言的同学都知道在.NET平台下基于LINQ的EntityFramework的ORM框架吧,而本次教程就是在python中复现一下ef框架
因为我们的测试环境是在MySQL下的,所以要引入MySQL的包
import pymysql
然后要引入写好的DBContext包
from DBContext import *
表的构造
name:tb_user
字段名 | 类型 | 键 |
---|---|---|
Name | nchar(10) | 主键 |
Age | int |
然后我们要编写我们的上下文类
(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 |
该框架改进的地方有,但是也能正常使用,后面的教程就是框架的构建,欢迎订阅