python+flask后端开发~进阶系列 | 对象关系映射ORN模型与数据库→表之间的映射

简介:在后端开发中,Python + Flask 组合凭借其简洁高效、灵活易用的特点,深受广大开发者的青睐。而对象关系映射(ORM)技术更是为数据库操作带来了革命性的变革。读完本文,你将 深入理解ORM模型在 Python + Flask 后端开发中的关键作用。
目录:
一、对象关系映射ORM模型
1.1 基本介绍
1.2 主要优势
二、ORM模型的应用实例
2.1 实例对象的创建
2.2 实例对象User的验证与使用
2.3 与底层SQL语句之间的性能比较
三、结束语
🚀 读完本文,你将解锁以下超实用技能和知识储备:
- 深入理解 ORM 模型的核心概念:掌握 ORM 模型的定义、原理以及它如何将面向对象的编程思想与关系型数据库完美结合。
- 掌握 ORM 模型的主要优势:了解 ORM 模型如何简化数据库操作、提高开发效率、增强代码的可维护性和可扩展性。
- 学会使用 SQLAlchemy 进行 ORM 模型的创建和操作:通过具体的实例,学习如何使用 SQLAlchemy 创建 ORM 模型,如何将模型映射到数据库表。
- 掌握 ORM 模型与底层 SQL 语句之间的性能比较:了解 ORM 模型在不同场景下的性能表现,学会如何根据实际需求选择合适的操作方式,以实现性能与开发效率的平衡。
一、对象关系映射ORM模型
1.1 基本介绍
对象关系映射(Object-Relational Mapping,简称 ORM)是一种编程技术,用于实现面向对象编程语言中的对象与关系型数据库中的表之间的映射。在 Python 中,最常用的 ORM 框架是SQLAlchemy。
ORM 模型的核心思想是将数据库中的表映射为 Python 中的类,表中的每一行数据映射为类的一个实例对象。通过这种方式,开发者可以使用面向对象的方式操作数据库,而无需直接编写 SQL 语句。
一个ORM 模型与数据库中一个表相对应,ORM 模型中的每个类属性分别对应表的每个字段,ORM 模型的每个实例对象对应表中每条记录。
1.2 主要优势
ORM 模型具有以下主要优势:
- 简化数据库操作:ORM 模型将数据库操作封装在对象和方法中,开发者无需直接编写 SQL 语句,降低了数据库操作的复杂性。
- 提高开发效率:通过 ORM 模型,开发者可以使用面向对象的方式操作数据库,代码更加简洁易读,开发效率显著提高。
- 增强代码的可维护性和可扩展性:ORM 模型将数据库操作与业务逻辑分离,使得代码结构更加清晰,便于维护和扩展。
- 降低数据库操作的出错率:ORM 框架会自动处理 SQL 语句的生成和执行,减少了因手写 SQL 语句而导致的错误。
二、ORM模型的应用实例
2.1 实例对象的创建
- 初始的Flask后端代码准备:在开始创建ORM对象之前,要保证后台MySQL数据库的开启以及建立Flask后端与MySQL的链接,具体方法可以参考我的前一篇博客文章:Python + Flask 后端开发~进阶系列 | Flask与底层数据库(MySQL)的连接。
# -*- coding: utf-8 -*-
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# MySQL 所在的主机名
HOSTNAME = "127.0.0.1"
# MYSQL 监听的端口号,默认3306
PORT = 3306
# 连接MySQL的用户名,读者用自己设置的
USERNAME = "root"
# 连接 MYSQL的密码,读者用自己的
PASSWORD = "******"
# MYSQL上创建的数据库名称
DATABASE = "backdb_test"
app.config['SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charsetut-8mb4"
# 在app.config中设置连接数据库的基本信息
# 然后使用SQLAlchemy(app)创建一个db对象
# SQLAlchemy会自动读取app.config中的配置信息
db = SQLAlchemy(app)
@app.route('/')
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run()
- 实例对象的创建代码:这里我创建了一个
User对象,并在对象中规定表名为user,在表中添加了3个字段,id,username,和password。并对每个字段的属性进行了规定。
db = SQLAlchemy(app)
class User(db.Model):
# 创建一个表,名为user,可自定义
__tablename__ = "user"
# 添加主键字段,并定义了类型、主键、自增
id = db.Column(db.Integer, primary_key = True, autoincrement = True)
# 添加字段,并指定字符长度,非空
username = db.Column(db.String(100), nullable = False)
password = db.Column(db.String(100), nullable = False)
with app.app_context():
db.create_all()
- 运行结果:下面给出了运行代码前后的数据库信息,可以看到,运行代码后在数据库中分别新建了
user表和相关字段,验证代码成功。


我将在后续文章中继续介绍如何使用实例对象对底层数据库执行增、删、改、查的基本操作。
2.2 与底层SQL语句之间的性能比较
在使用 ORM 模型进行数据库操作时,一个常见的问题是:ORM 模型与底层 SQL 语句在性能上是否存在差异?答案是肯定的,但这种差异并非绝对,而是取决于具体的使用场景。
ORM 模型的性能特点
- ORM 模型的核心优势在于其抽象性和易用性。通过将数据库表映射为对象,ORM 框架允许开发者以面向对象的方式操作数据库,而无需直接编写 SQL 语句。这种方式大大简化了开发流程,提高了开发效率。然而,这种抽象性也带来了一定的性能开销。
- 抽象层的开销:ORM 框架在执行数据库操作时,需要将对象的操作转换为对应的 SQL 语句。这个转换过程涉及额外的计算和内存消耗。例如,当查询大量数据时,ORM 框架需要解析查询条件、生成 SQL 语句,并将结果映射回对象,这些步骤都会增加执行时间。
- 动态生成 SQL:ORM 框架通常会动态生成 SQL 语句。虽然这种方式可以提高开发的灵活性,但在某些复杂查询场景下,生成的 SQL 语句可能不是最优的。例如,ORM 框架可能无法像手工优化的 SQL 语句那样高效地利用数据库的索引或执行计划。
原生 SQL 的性能特点
- 原生 SQL 语句是直接与数据库交互的方式,它没有中间层的抽象和转换,因此在性能上通常更优。使用原生 SQL 语句时,开发者可以精确控制 SQL 的执行逻辑,优化查询语句以适应具体的数据库结构和数据量。
- 执行效率高:由于没有中间层的转换和解析,原生 SQL 语句可以直接被数据库引擎执行,减少了执行时间。特别是在处理大量数据或复杂查询时,原生 SQL 的优势更为明显。
- 优化空间大:开发者可以根据数据库的具体情况(如表结构、索引、数据量等)对 SQL 语句进行优化。例如,通过合理使用索引、优化 JOIN 操作、减少不必要的字段查询等方式,可以显著提高查询性能。
性能比较的场景分析
- 简单查询:
- ORM 模型:对于简单的查询操作(如查询单条记录或少量字段),ORM 模型的性能开销相对较小。ORM 框架能够快速生成并执行 SQL 语句,同时将结果映射为对象,方便后续操作。
- 原生 SQL:虽然原生 SQL 在执行效率上略高,但这种差异在简单查询中通常不明显。因此,在这种场景下,使用 ORM 模型的优势在于开发效率和代码可读性。
- 复杂查询:
- ORM 模型:在复杂的查询场景中(如多表 JOIN、子查询、分组聚合等),ORM 框架生成的 SQL 语句可能不够优化。例如,ORM 框架可能无法充分利用数据库的索引,导致查询效率低下。
- 原生 SQL:在这种场景下,原生 SQL 的优势更为明显。开发者可以通过手动优化 SQL 语句,确保查询语句的高效执行。例如,通过合理使用索引、优化 JOIN 条件、减少返回的字段数量等方式,可以显著提高查询性能。
- 批量操作:
- ORM 模型:对于批量插入、更新或删除操作,ORM 模型的性能开销较大。每次操作都需要将对象映射为 SQL 语句并执行,这会导致大量的数据库交互和网络开销。
- 原生 SQL:原生 SQL 在批量操作中通常表现更好。通过使用批量执行语句(如 INSERT INTO … VALUES (…), (…), …),可以显著减少数据库交互次数,提高操作效率。
- 性能比较的总结
- 开发效率:ORM 模型在开发效率上具有明显优势,尤其是在简单查询和日常开发中。它简化了数据库操作,减少了代码量,提高了开发速度。
- 性能优化:原生 SQL 在性能优化方面更具优势,特别是在复杂查询和批量操作中。通过手动优化 SQL 语句,可以充分利用数据库的特性,提高查询和操作效率。
- 实际应用建议
- 在实际开发中,选择 ORM 模型还是原生 SQL 语句,应根据具体需求进行权衡:优先使用 ORM 模型:在大多数情况下,ORM 模型的开发效率和代码可维护性优势更为重要。特别是在项目初期或需求变化频繁的阶段,使用 ORM 模型可以快速实现功能。
- 在性能关键场景中使用原生 SQL:对于性能要求极高的场景(如复杂查询、批量操作等),可以考虑使用原生 SQL 语句。通过手动优化 SQL 语句,可以确保操作的高效执行。
三、结束语
通过本文的介绍,相信你已经对 ORM 模型有了更深入的理解,并掌握了如何在 Python + Flask 后端开发中使用 SQLAlchemy 进行 ORM 模型的创建。
ORM 模型作为一种强大的开发工具,可以帮助我们更高效地开发后端应用,同时提高代码的可维护性和可扩展性。希望本文的内容对你有所帮助,如果你有任何疑问或建议,欢迎在评论区留言交流。
最后,感谢你的阅读!如果你觉得本文对你有帮助,不妨点赞和关注,我会继续分享更多关于 Python 和 Flask 开发的实用知识。🚀
关注专栏,每周更新,带你从“第一个 Flask 项目”一路进阶到“Docker 部署、JWT 鉴权、微服务拆分”。
版权归作者所有,未经许可请勿抄袭,套用,商用(或其它具有利益性行为)。
– 欢迎扫码关注:华北理工大学低碳与智能冶金实验室
更多推荐



所有评论(0)