Flask的ORM工具SQLAlchemy

news/2025/9/26 10:04:19/文章来源:https://www.cnblogs.com/hqq2019-10/p/19112963

Flask的ORM工具SQLAlchemy

一、ORM 是什么?

ORM(Object-Relational Mapping,对象关系映射)是一种编程技术,用于在面向对象的编程语言与关系型数据库之间建立映射关系。它允许开发者使用面向对象的语法(如类、对象、方法)操作数据库,而无需直接编写 SQL 语句。

 

ORM 的核心作用:

  •  抽象数据库操作:将数据库表映射为编程语言中的“类”,表中的行映射为“对象”,表的字段映射为“对象属性”。
  •  屏蔽数据库差异:同一套 ORM 代码可适配多种数据库(如 MySQL、PostgreSQL、SQLite 等),无需修改核心逻辑。
  •  简化开发流程:避免手动编写复杂 SQL,减少出错概率,同时让代码更易读、易维护。

 

二、Flask 的 ORM 工具:SQLAlchemy 详解

SQLAlchemy 是 Python 生态中最流行的 ORM 框架之一,并非专为 Flask 设计,但通过 Flask-SQLAlchemy扩展可与 Flask 无缝集成,成为 Flask 项目中操作数据库的首选工具。

1、SQLAlchemy 的定位

SQLAlchemy 不仅是 ORM,更是一个“SQL 工具包”,它包含两部分核心功能:

  • Core(核心):提供 SQL 表达式语言,可直接通过 Python 代码生成 SQL 语句(类似“高级 SQL 生成器”)。
  • ORM:在 Core 基础上封装的对象关系映射层,支持通过类和对象操作数据库。

 

2、Flask-SQLAlchemy 扩展

Flask-SQLAlchemy 是 Flask 官方推荐的扩展,它简化了 SQLAlchemy 与 Flask 的集成,自动处理配置、会话管理等细节。

 (1)安装

pip install flask-sqlalchemy

 

 (2)基本配置与初始化

在 Flask 项目中,需先配置数据库连接信息并初始化 SQLAlchemy:

from flask import Flask
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)# 配置数据库 URI(以 SQLite 为例,文件型数据库,无需额外服务)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.db'
# 关闭 SQLAlchemy 的修改跟踪功能(优化性能)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False# 初始化 SQLAlchemy 实例,关联 Flask 应用
db = SQLAlchemy(app)

 

数据库 URI 格式(不同数据库):

  •    SQLite:sqlite:///数据库文件名.db(相对路径,文件存于项目根目录)
  •    MySQL:mysql+pymysql://用户名:密码@主机:端口/数据库名
  •    PostgreSQL:postgresql://用户名:密码@主机:端口/数据库名

 

3、核心概念与使用

 (1)模型(Model):映射数据库表

模型是 ORM 的核心,对应数据库中的一张表。通过继承 db.Model 定义模型类,类的属性对应表的字段。

示例:定义一个 User 模型(对应 user 表):

class User(db.Model):#表名(不指定则默认用类名小写,如 User → user)__tablename__ = 'users'#字段定义:id(主键,自增整数)id = db.Column(db.Integer, primary_key=True)#用户名(字符串,非空,唯一)username = db.Column(db.String(80), unique=True, nullable=False)#邮箱(字符串,非空,唯一)email = db.Column(db.String(120), unique=True, nullable=False)#定义对象的字符串表示(便于调试)def __repr__(self):return f'<User {self.username}>'

- db.Column:定义表的字段,第一个参数为数据类型(如 db.Integer、db.String)。

- 常用参数:

  •    primary_key=True:设为主键。
  •    unique=True:字段值唯一(如用户名不可重复)。
  •    nullable=False:字段不可为空(必填)。
  •    default:设置默认值(如 default=datetime.utcnow)。

 

 (2)创建数据库和表

定义模型后,需通过代码创建实际的数据库文件和表:

#在 Flask 应用上下文内执行(如在视图函数中,或通过 shell)with app.app_context():    #创建所有模型对应的表(若表已存在则不重复创建)    db.create_all()

执行后,项目根目录会生成 mydatabase.db(SQLite),包含 users 表。

 

 (3)会话(Session):操作数据库的“接口”

SQLAlchemy 通过“会话(Session)”执行数据库操作(增删改查),Flask-SQLAlchemy 中通过 db.session 调用。

会话的作用:暂存所有操作,最终通过 commit() 提交到数据库,类似“事务”。

 

 (4)基本操作示例

 ① 新增数据(插入)

with app.app_context():#创建用户对象(对应表中的一行)user1 = User(username='alice', email='alice@example.com')user2 = User(username='bob', email='bob@example.com')#将对象添加到会话db.session.add(user1)db.session.add(user2)   #可批量添加:db.session.add_all([user1, user2])#提交会话(实际写入数据库)db.session.commit()

 

 ② 查询数据

Flask-SQLAlchemy 提供了丰富的查询方法,通过 模型类.query 调用:

with app.app_context():#1. 查询所有用户(返回列表)all_users = User.query.all()print(all_users)  # [<User alice>, <User bob>]#2. 查询第一个用户first_user = User.query.first()print(first_user.username)   #'alice'#3. 通过主键查询(高效)user_by_id = User.query.get(1)   #查询 id=1 的用户print(user_by_id.email)   # 'alice@example.com'#4. 条件查询(filter_by,简化版,只支持关键字参数)user_bob = User.query.filter_by(username='bob').first()#5. 复杂条件查询(filter,支持表达式)#例如:查询邮箱包含 'example' 的用户users_with_example = User.query.filter(User.email.like('%example%')).all()#6. 排序(按 username 升序)sorted_users = User.query.order_by(User.username).all()#7. 限制查询数量(前 10 条)limited_users = User.query.limit(10).all()

 

 ③ 更新数据

with app.app_context():    #1. 先查询到要更新的对象    user = User.query.filter_by(username='alice').first()    #2. 修改属性    user.email = 'new_alice@example.com'
      #3. 提交会话(保存修改)    db.session.commit()

 

 ④ 删除数据

with app.app_context():    #1. 先查询到要删除的对象
    user = User.query.filter_by(username='bob').first()    #2. 从会话中删除
    db.session.delete(user)    #3. 提交会话(执行删除)
    db.session.commit()

 

 (5)关系(Relationship):处理表之间的关联

实际数据库中表常有关联(如“用户-文章”一对多),SQLAlchemy 通过 db.relationship 定义模型间的关系。

 

示例:用户(User)和文章(Post)的一对多关系:

class Post(db.Model):__tablename__ = 'posts'id = db.Column(db.Integer, primary_key=True)title = db.Column(db.String(100), nullable=False)content = db.Column(db.Text, nullable=False)#外键:关联 users 表的 id 字段user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)#定义与 User 的反向关系(一个用户对应多篇文章)#backref:在 User 中自动添加 posts 属性,可通过 user.posts 获取该用户的所有文章author = db.relationship('User', backref=db.backref('posts', lazy=True))

使用示例:

with app.app_context():#查询用户的所有文章user = User.query.get(1)user_posts = user.posts   #所有该用户的文章列表#查询文章的作者post = Post.query.get(1)post_author = post.author   #文章对应的用户对象

 

4、数据库迁移:Flask-Migrate

当模型结构变更(如新增字段、修改类型)时,直接删除表重建会丢失数据。Flask-Migrate 扩展基于 Alembic(SQLAlchemy 作者开发的迁移工具),可安全地同步模型变更到数据库。

 (1)安装

pip install flask-migrate

 

 (2)初始化

from flask_migrate import Migrate#关联 app 和 db
migrate = Migrate(app, db)

 (3)常用迁移命令

# 初始化迁移环境(仅首次执行)
flask db init#生成迁移脚本(检测模型与数据库的差异)
flask db migrate -m "描述迁移内容,如:新增用户年龄字段"#执行迁移(将脚本应用到数据库)
flask db upgrade

 

三、SQLAlchemy 的优势

  1. 灵活性:支持 ORM 模式(面向对象)和 Core 模式(直接生成 SQL),可根据需求选择。
  2. 跨数据库兼容:一套代码适配多种数据库,切换数据库只需修改 URI。
  3. 强大的查询能力:提供丰富的查询 API,支持复杂条件、联表查询、聚合函数等。
  4. 事务支持:通过会话的 commit() 和 rollback()(回滚)保证数据一致性。
  5. 与 Flask 无缝集成:Flask-SQLAlchemy 简化了配置和会话管理,开箱即用。

四、总结

ORM 是连接面向对象编程与关系型数据库的桥梁,而 SQLAlchemy 是 Python 中功能最完善的 ORM 工具之一。通过 Flask-SQLAlchemy 扩展,开发者可以在 Flask 项目中用简洁的面向对象语法操作数据库,大幅提升开发效率,同时保证代码的可维护性和扩展性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/918090.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 Rust 和 Tesseract OCR 实现英文数字验证码识别

Rust 是一门注重内存安全并具有高性能的系统编程语言。它通过并发机制和零成本抽象提供了强大的功能。我们可以利用 Rust 的库来调用 Tesseract OCR 实现验证码识别。 一、安装与配置 安装 Tesseract OCR 同样,首先要…

构建复合AI系统以实现可扩展工作流

了解如何利用复合AI系统架构化模块化且安全的智能体工作流,以实现可扩展的企业自动化。生成式AI、大语言模型和多智能体编排的融合催生了一个变革性的概念:复合AI系统。这些架构超越了单个模型或助手,代表了智能代理…

seo网站诊断顾问微博wordpress插件

题目大意&#xff1a; 给定一段连续的整数&#xff0c;求出他们中所有偶数的平方和以及所有奇数的立方和。 解答&#xff1a; 坑你没商量&#xff01;要考虑输入数a,b的大小。如果a>b,需要交换a&#xff0c;b的值。转载于:https://www.cnblogs.com/ZJUT-jiangnan/p/3613488.…

Python HTTPS 爬虫实战,requests aiohttp Selenium 抓取技巧、HTTPS 问题与抓包调试(python https爬虫、反爬、抓包、证书处理)

本文讲解 Python HTTPS 爬虫实战:requests/ aiohttp/ Selenium 的使用场景、证书与 TLS 问题处理、反爬策略与代理池构建,及如何用 mitmproxy/Charles 和真机直连工具(抓包大师 Sniffmaster)做 HTTPS 抓包与握手分…

网站素材设计手机网站排名怎么做

介绍 最近在导入数据库数据, 有时候给的数据源文件,存在重复数据, 需要清除但是还需要保留一条记录的需求. 本文将介绍如何使用SQL Server来实现这个需求。 流程 下面是实现删除重复数据的流程&#xff0c;我们可以用表格展示每个步骤&#xff1a; 步骤 描述 步骤一 先…

电子商务物流网站建设规划方案wordpress主题 报纸

当谈到可视化工具时&#xff0c;有许多常用的工具可供选择。这些工具可以帮助我们将数据转化为易于理解和具有视觉吸引力的图表、图形和仪表板。 以下是10款常用的可视化工具&#xff0c;它们在不同领域和用途中广泛使用。 1. Datainside&#xff1a; Datainside是一款功能强…

网站服务商是什么无代码网站建设培训

作者 | Manish Gupta OneFlow编译 翻译&#xff5c;宛子琳、杨婷 AI驱动的技术正逐渐融入人们日常生活的各个角落&#xff0c;有望提高人们获取知识的能力&#xff0c;并提升整体生产效率。语言大模型&#xff08;LLM&#xff09;正是这些应用的核心。LLM对内存的需求很高&…

深入解析:基于开源AI大模型AI智能名片S2B2C商城小程序的产地优势产品营销策略研究

深入解析:基于开源AI大模型AI智能名片S2B2C商城小程序的产地优势产品营销策略研究pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; fon…

GreatSQL 优化技巧:最值子查询与窗口函数相互转换

GreatSQL 优化技巧:最值子查询与窗口函数相互转换 导语 近期 SQL 优化过程中遇到两个案例,一个是将最值子查询改写为窗口函数,另一个是将窗口函数改写为最值子查询,觉得很有意思,特此记录分享一下。 SQL案例 两个…

Windows Time 时间同步时出错

前言全局说明Windows Time 时间同步时出错一、说明 1.1 环境: Windows 7 旗舰版二、注册表相关参数位置 2.1 时间服务器列表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers2.2 配置…

长沙市天心区建设局网站做购物网站需要学数据库吗

前言&#xff1a;在日常的开发工作当中可能需要实现一个二维码小功能&#xff0c;我参考了网上很多关于SpringBoot生成二维码的教程&#xff0c;最终还是自己封装了一套完整生成二维码的工具类&#xff0c;可以支持基础的黑白二维码、带颜色的二维码、带Logo的二维码、带颜色和…

网站建设设计费用手机怎么制作网站网址

gulp需要全局安装和当前目录都安装才能使用gulp命令 安装gulp插件 npm install gulp-rev gulp-rev-replace gulp-useref gulp-filter gulp-uglify gulp-csso --save-dev gulp-rev&#xff1a;给每个文件添加版本号&#xff0c;根据文件内容计算hash码&#xff0c;修改文件名&am…

可信网站服务周村网站制作价格低

【高并发】高并发环境下如何防止Tomcat内存溢出&#xff1f;看完我懂了&#xff01;&#xff01;发布时间&#xff1a;2020-04-19 00:47,浏览次数&#xff1a;126, 标签&#xff1a;Tomcat写在前面随着系统并发量越来越高&#xff0c;Tomcat所占用的内存就会越来越大&#xff0…

云主机如何做网站宜宾建设教育培训中心网站

YOLO v3可以说是单阶段检测器中的佼佼者&#xff0c;融合了多个框架的优势&#xff0c;在保持模型简洁性的同时&#xff0c;性能上也在当时达到了stoa。YOLO v3的主干网络是darknet-53的前面的52层&#xff0c;所以它是一个全卷积网络&#xff0c;并且为了降低池化带来的梯度负…

鸿蒙自定义弹出框响应式更新数据

鸿蒙自定义弹出框响应式更新数据1.原因: openCustomDialog不支持自定义组件使用@Reusable、@Link、@Provide、@Consume等装饰器,来同步弹出框弹出的页面与ComponentContent中自定义组件的状态 2.解决class Params { …

CCS开发环境和TMS320系列DSP实现IP-IQ谐波与无功电流检测

CCS开发环境和TMS320系列DSP实现IP-IQ谐波与无功电流检测一、系统架构设计 1. 硬件组成 +-------------------+| 三相电网 || (电压/电流互感器) |+--------+----------+|v +-------------------+ +---…

深入解析:Python数据分析:求矩阵的秩。啥是矩阵秩?听故事学线代并用Python实现,娘来太容易学会了!

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

多机动模型PHD滤波算法

一、算法框架与核心思想 多机动模型PHD(Probability Hypothesis Density)滤波结合了交互多模型(IMM)与概率假设密度滤波的优势,通过动态模型切换实现多机动目标跟踪。 关键特性:多模型交互:每个粒子携带模型索引…

Navicat17无限试用重置14天

若navicat 17安装后无法正常注册,则可以尝试以下方法。 把以下文本另存为.bat文件,每次执行,都会将试用剩余天数重置为14天,实现无限试用的目的。 本脚本主要以测试学习为目的用后请及时删除,如果需要请购买正版.…

基于Electron的Web打印解决方案:web-print-pdf技术分享

引言 在Web应用开发中,打印功能一直是一个令人头疼的问题。传统的Web打印方案存在样式丢失、兼容性差、功能单一等诸多痛点。最近偶然发现了一个名为web-print-pdf的npm包,在调查了几款常见的Web打印实现后,发现大多…