ORM 介绍
简介
什么是 ORM
ORM 全称 Object Relational Mapping, 翻译过来叫对象关系映射。ORM 将数据库中的表与面向对象语言中的类建立了一种对应关系,通过描述对象与数据库表之间的映射关系,自动将对象持久化到关系型数据库的表中。数据库中的表或者表中的一条记录就可以直接通过操作类或者类实例来完成。
什么是持久化
持久化(Persistence)就是把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。
持久化的主要应用,也就是将内存中的数据存储在关系型的数据库中,然后调用的时候也是从库里取,这是最常用的方式。
为什么需要持久化服务呢?其实也是内存本身的缺陷导致的。因为当程序中断或者设备断电后,内存中的数据会全部消失。如果想把需要的信息保存下来,就需要对它们持久化。
为了实现数据持久化,作为后端工程师就需要编写各式各类的复杂 SQL 语句。这样会给开发带来更多额外的学习成本与开发成本,并且数据库中的表、字段和实体类之间并没有实现一一对应的关系。
为了让数据库和实体类(对象模型)之间实现完全的对应关系,所以出现了 ORM 这样的框架。
ORM 与 SQL 的对比
ORM 和 SQL 是用于访问和管理数据库的不同方法,它们具有各自的优势和劣势。先来对比一下两种方法在具体操作数据库时的区别。
传统的数据库操作
- 连接数据库
- 创建游标 cursor
- 执行 SQL 语句
- 获取查询结果
- 关闭连接
# 使用 SQL 语句查询数据
sql = """SELECT
username,
email,
gender
FROM
user
WHERE
id = 1"""
# 连接数据库
conn = pymysql.Connect(**database_info)
# 创建游标
cursor = conn.cursor()
# 执行 SQL 语句
cursor.execute(sql)
# 获取查询结果
datas = cursor.fetchall()
# 关闭连接
cursor.close()
conn.close()
ORM 操作
- 连接数据库
- 使用 ORM 查询数据
- 关闭连接
# 连接数据库
# 使用 ORM 查询数据
res = db_session.query(User).\
filter_by(id=1).first()
# 关闭连接
从上面的实例中可以看出,使用 ORM 框架操作数据库的代码逻辑要更加的简洁。
ORM 优点与缺点
ORM 框架具有很多的优点,当然也有对应的缺点。以下表格中对比了 ORM 框架的优点和缺点。
优点 | 缺点 |
---|---|
抽象数据访问层 | 性能开销 |
提高开发效率 | 复杂查询性能下降 |
数据库无关性 | 学习曲线 |
减少 SQL 注入风险 | 限制数据库灵活性 |
面向对象编程 | 生成的 SQL 不一定高效 |
易于维护和调试 | 难以优化复杂查询 |
增强可移植性 | 不适用于所有场景 |
ORM 映射关系
ORM 是通过类和对象操作数据库,所以在 ORM 中必须先理解编程语言中的类与对象和数据库中的表之间的映射关系。
- 类与数据库中表的映射:数据库中的每一张表对应编程语言中的一个类。当对类进行基本操作,比如创建,修改对象的属性,删除实例时,ORM 框架会自动对数据库中的表进行相应的 CURD 操作。
- 对象与表中记录的映射:关系数据库中的一张表可能有多条记录,每条记录对应类的一个实例。当用户对一个对象进行修改时,ORM 框架会自动对数据表中的相应记录进行修改。
- 类的属性与数据库中表的字段的映射:数据库中表的字段的数据类型与类中的属性的类型是一一对应的。
总结
在本章节中,介绍了 ORM 框架的相关概念。
- 什么是 ORM
- 什么是持久化
- ORM 与 SQL 的对比
- ORM 优点与缺点
- ORM 映射关系