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()  

流程说明

  1. 实例化模型类对象。
  2. 通过 session.add() 将对象加入待提交列表。
  3. 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 是通行规则,而最佳实践则是维护桥梁安全的指南。建议读者在理解本文内容后,尝试以下进阶方向:

  1. 探索 Flask-Migrate 实现数据库迁移;
  2. 对比其他 ORM 框架(如 SQLModel)的特性;
  3. 结合 RESTful API 设计完整的数据接口。

通过持续实践,开发者将能高效、安全地利用 Flask 构建功能强大的数据驱动型应用。

最新发布