Flask 数据库操作(保姆级教程)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
前言
在现代 Web 开发中,数据库操作是构建应用的核心能力之一。Flask 框架凭借其轻量级和灵活性,成为许多开发者构建中小型 Web 应用的首选。然而,对于编程初学者和中级开发者而言,如何高效且安全地操作数据库,是掌握 Flask 技术栈的关键一步。本文将从基础到进阶,结合实际案例与代码示例,系统讲解 Flask 数据库操作的完整流程,并通过形象的比喻和逻辑清晰的结构,帮助读者逐步掌握这一技能。
环境搭建与配置
安装依赖
要开始 Flask 数据库操作,需先安装 Flask 和数据库扩展库。本例以 Flask-SQLAlchemy
为例,它是一个基于 SQLAlchemy 的轻量级 ORM(对象关系映射)工具,能够简化数据库交互。
pip install Flask Flask-SQLAlchemy
配置数据库连接
配置数据库连接是连接 Flask 应用与数据库的第一步。例如,若使用 SQLite 数据库,可在应用配置文件中定义如下代码:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db' # 指定数据库路径
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
比喻解释:
数据库配置类似于为应用安装导航系统,SQLALCHEMY_DATABASE_URI
就像告诉导航目的地的地址,而 SQLALCHEMY_TRACK_MODIFICATIONS
则是关闭不必要的内存追踪,提升性能。
数据库基础操作
定义数据模型
在 Flask-SQLAlchemy 中,数据模型通过 Python 类定义,每个类对应数据库中的一个表。例如,创建一个 User
表来存储用户信息:
class User(db.Model):
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.Model
是基类,所有模型需继承它。db.Column
定义表的字段,如id
是主键,username
是长度 80 的唯一字符串。__repr__
方法用于返回对象的字符串表示,便于调试。
比喻:
数据模型就像图书馆的书架分类规则——每个书架(表)有固定的分类规则(字段),例如“小说”分类(表名)下包含作者(字段)、出版年份(字段)等属性。
创建表结构
定义模型后,需通过 db.create_all()
方法创建数据库表:
with app.app_context():
db.create_all()
此代码会根据所有已定义的模型,在数据库中生成对应的表结构。
基本 CRUD 操作
创建数据(Create)
向数据库插入新记录:
new_user = User(username='alice', email='alice@example.com')
db.session.add(new_user)
db.session.commit()
流程说明:
- 实例化模型类对象。
- 通过
session.add()
将对象加入待提交列表。 session.commit()
提交事务,实际写入数据库。
查询数据(Read)
查询所有用户:
users = User.query.all()
print(users)
精确查询(如通过用户名):
user = User.query.filter_by(username='alice').first()
print(user.email) # 输出 alice@example.com
更新数据(Update)
修改用户邮箱:
user = User.query.filter_by(username='alice').first()
user.email = 'alice_new@example.com'
db.session.commit()
删除数据(Delete)
删除指定用户:
user = User.query.filter_by(username='alice').first()
db.session.delete(user)
db.session.commit()
总结:
CRUD 操作类似于图书馆管理员对书籍的管理——添加新书(Create)、查找书籍(Read)、修改标签(Update)和移除书籍(Delete)。
高级数据库操作
事务处理
事务确保操作的原子性,即一组操作要么全部成功,要么全部失败。例如,银行转账场景:
try:
# 扣除用户A的余额
user_a.balance -= 100
# 增加用户B的余额
user_b.balance += 100
db.session.commit()
except Exception:
db.session.rollback()
print("转账失败,事务已回滚")
比喻:
事务如同“魔法咒语”——只有念完整个咒语(所有操作完成),魔法才会生效;若中途被打断(发生错误),一切恢复原状。
连接池优化
频繁创建和关闭数据库连接会消耗资源,使用连接池可复用连接。配置示例:
app.config['SQLALCHEMY_POOL_SIZE'] = 20 # 最大连接数
app.config['SQLALCHEMY_POOL_RECYCLE'] = 3600 # 连接空闲超时时间(秒)
作用:
连接池如同“快递分拣中心”,预先准备好多个连接,避免每次请求都从零开始建立连接,显著提升性能。
最佳实践与注意事项
查询优化
避免全表扫描,使用索引和条件过滤。例如:
- 使用
limit()
和offset()
分页查询:users = User.query.order_by(User.id.desc()).limit(10).all()
- 通过
filter()
精准匹配:User.query.filter(User.username.like('%alice%')).all() # 模糊查询
测试与文档
- 测试:在开发环境中使用内存数据库(如
sqlite:///:memory:
),避免污染真实数据。 - 文档:为每个模型和字段添加注释,例如:
class Order(db.Model): """用户订单表""" id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey('user.id')) # 关联用户表
异常处理
数据库操作可能因网络中断或语法错误失败,需用 try-except
捕获异常:
from sqlalchemy.exc import SQLAlchemyError
try:
db.session.commit()
except SQLAlchemyError as e:
print(f"数据库错误: {str(e)}")
db.session.rollback()
结论
通过本文,读者应已掌握 Flask 数据库操作的核心流程,从环境配置到复杂事务处理,均通过案例与代码示例深入浅出地讲解。学习 Flask 数据库操作如同搭建一座桥梁——模型是桥墩,CRUD 是通行规则,而最佳实践则是维护桥梁安全的指南。建议读者在理解本文内容后,尝试以下进阶方向:
- 探索
Flask-Migrate
实现数据库迁移; - 对比其他 ORM 框架(如
SQLModel
)的特性; - 结合 RESTful API 设计完整的数据接口。
通过持续实践,开发者将能高效、安全地利用 Flask 构建功能强大的数据驱动型应用。