Flask-SQLAlchemy 分析

一只猴子在敲电脑,背景是放着一排排服务器的机房,整个场景采用了幽默卡通风格,色彩鲜艳

Flask-SQLAlchemy 是一个 Flask 扩展,他将 SQLAlchemy 集成到 Flask 应用程序中,提供了快速而简单的方式来创建和管理数据库模型。它的主要内容包括:

  • 数据库配置:Flask-SQLAlchemy 提供了一个类似于 SQLAlchemy 的配置方式,你可以轻松地指定数据库连接的 URL,比如 MySQL 或 PostgreSQL。

  • 模型定义:Flask-SQLAlchemy 支持使用 Python 类来定义数据库模型。类对应于数据库表,属性对应于表字段。

  • 数据库操作:Flask-SQLAlchemy 提供了丰富的操作数据库的 API,比如增删改查、事务等。

  • 数据库迁移:Flask-SQLAlchemy 提供了集成 Alembic 的功能,可以方便地进行数据库迁移。

  • 查询构建:Flask-SQLAlchemy 支持 SQL 查询的构建,同时也提供了直接使用 ORM 的方式来查询数据库。

  • 事件扩展:Flask-SQLAlchemy 支持事件扩展,你可以通过事件来拦截数据库操作,比如在写入数据库之前进行一些数据处理。

初始化扩展

这段代码是设置 Flask 应用程序使用 SQLAlchemy ORM 的基础配置。

# 导入 Flask 框架和 Flask-SQLAlchemy 扩展
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
# 导入 SQLAlchemy ORM 的基础类
from sqlalchemy.orm import DeclarativeBase
# 定义一个继承自 DeclarativeBase 的基类,用于创建映射类
class Base(DeclarativeBase):
    pass
# 初始化 Flask-SQLAlchemy 扩展,指定模型类的基类为自定义的 Base 类
db = SQLAlchemy(model_class=Base)

在这段代码中,Base 类是一个空的类,它继承自 DeclarativeBase,这是 SQLAlchemy ORM 的一个基础类,用于定义映射到数据库表的类。db 对象是 Flask-SQLAlchemy 的一个实例,它用于管理数据库会话和模型。通过将 model_class 参数设置为自定义的 Base 类,所有的模型都将继承自这个基类,从而能够使用 SQLAlchemy ORM 的功能。

配置扩展

这段代码是创建 Flask 应用程序并配置 SQLite 数据库的示例。

# 创建 Flask 应用实例
app = Flask(__name__)
# 配置 SQLite 数据库的 URI(数据库路径)
# "sqlite:///project.db" 表示创建一个名为 "project.db" 的 SQLite 数据库文件
# 该文件位于 Flask 应用的实例文件夹中
# 如果实例文件夹不存在,Flask 会自动创建它
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///project.db"
# 使用 Flask 应用实例初始化 Flask-SQLAlchemy 扩展
# 这使得 Flask-SQLAlchemy 可以使用应用配置来设置数据库会话和模型
db.init_app(app)

在这段代码中,首先创建了一个 Flask 应用实例 app。然后,配置了 SQLite 数据库的 URI,指定了数据库文件的路径。SQLALCHEMY_DATABASE_URI 是 Flask-SQLAlchemy 用于连接数据库的配置键。在这个例子中,使用的是 SQLite 数据库,并且数据库文件将命名为 project.db,位于 Flask 应用的实例文件夹中。
最后,调用 db.init_app(app) 方法来初始化 Flask-SQLAlchemy 扩展。这个方法将 Flask 应用实例 app 与 Flask-SQLAlchemy 实例 db 关联起来,使得 Flask-SQLAlchemy 可以使用应用的配置来管理数据库会话和模型。

定义模型

这段代码定义了一个使用 SQLAlchemy ORM 的 User 模型,该模型映射到数据库中的用户表。

# 导入 SQLAlchemy 的数据类型
from sqlalchemy import Integer, String
# 导入 SQLAlchemy ORM 的映射注解
from sqlalchemy.orm import Mapped, mapped_column
# 定义 User 类,继承自 db.Model,这是 Flask-SQLAlchemy 的模型基类
class User(db.Model):
    # 定义 id 字段,作为主键,数据类型为整数
    id: Mapped[int] = mapped_column(primary_key=True)
    # 定义 username 字段,数据类型为字符串,该字段在数据库中是唯一的
    username: Mapped[str] = mapped_column(unique=True)
    # 定义 email 字段,数据类型为字符串
    # 由于没有指定其他参数,它将创建为一个非唯一、非空的字符串列
    email: Mapped[str]

在这个例子中,User 类定义了一个用户模型,它包含三个字段:idusernameemailid 字段是主键,用于唯一标识数据库中的每个用户。username 字段是唯一的,这意味着数据库中不能有两个用户具有相同的用户名。email 字段是一个普通的字符串字段,没有指定唯一性或其他约束,所以它可以包含重复的值,并且在创建数据库表时不会设置为 NULL。

建表

这段代码使用 Flask 应用程序的上下文来创建数据库表。

# 使用 Flask 应用程序的上下文管理器
# app.app_context() 创建一个应用上下文对象
# with 语句确保这个上下文对象在代码块执行期间是活动的
with app.app_context():
    # 调用 db.create_all() 方法
    # 这个方法会根据定义的模型类创建相应的数据库表
    # 它会遍历所有继承自 db.Model 的类,并为每个类创建一个表
    # 这个过程依赖于模型类中定义的字段和关系来决定表的结构和字段
    db.create_all()

在 Flask 应用程序中,某些操作(如数据库操作)需要应用程序上下文才能正确执行。应用程序上下文包含了应用程序的必要信息,如配置和数据库会话。with app.app_context(): 语句创建了一个应用程序上下文,确保在 db.create_all() 调用期间,应用程序上下文是激活的。
db.create_all() 方法是 Flask-SQLAlchemy 提供的一个便利函数,它根据定义的模型类自动创建数据库表。这个方法会检查模型类的定义,并根据其中的字段和关系创建相应的表和列。如果数据库表已经存在,db.create_all() 不会对现有表做出任何改变。

查询数据

这段代码定义了几个 Flask 路由,用于处理用户的列表显示、创建、详细信息和删除操作。

# 定义路由 "/users",用于显示用户列表
@app.route("/users")
def user_list():
    # 查询数据库中的所有用户,并按用户名排序
    users = db.session.execute(db.select(User).order_by(User.username)).scalars()
    # 使用 user/list.html 模板渲染用户列表,并将 users 变量传递给模板
    return render_template("user/list.html", users=users)
# 定义路由 "/users/create",用于创建新用户,支持 GET 和 POST 方法
@app.route("/users/create", methods=["GET", "POST"])
def user_create():
    # 如果是 POST 请求,则处理表单提交
    if request.method == "POST":
        # 创建一个新的 User 对象,使用表单中的数据
        user = User(
            username=request.form["username"],
            email=request.form["email"],
        )
        # 将新用户添加到数据库会话
        db.session.add(user)
        # 提交数据库会话,保存新用户
        db.session.commit()
        # 重定向到新创建用户的详细信息页面
        return redirect(url_for("user_detail", id=user.id))
    # 如果是 GET 请求,则渲染用户创建表单
    return render_template("user/create.html")
# 定义路由 "/user/<int:id>",用于显示用户的详细信息
@app.route("/user/<int:id>")
def user_detail(id):
    # 从数据库中获取指定 ID 的用户,如果不存在则返回 404 错误
    user = db.get_or_404(User, id)
    # 使用 user/detail.html 模板渲染用户详细信息,并将 user 变量传递给模板
    return render_template("user/detail.html", user=user)
# 定义路由 "/user/<int:id>/delete",用于删除用户,支持 GET 和 POST 方法
@app.route("/user/<int:id>/delete", methods=["GET", "POST"])
def user_delete(id):
    # 从数据库中获取指定 ID 的用户,如果不存在则返回 404 错误
    user = db.get_or_404(User, id)
    # 如果是 POST 请求,则处理删除操作
    if request.method == "POST":
        # 从数据库会话中删除用户
        db.session.delete(user)
        # 提交数据库会话,完成删除操作
        db.session.commit()
        # 重定向到用户列表页面
        return redirect(url_for("user_list"))
    # 如果是 GET 请求,则渲染用户删除确认页面
    return render_template("user/delete.html", user=user)

这些路由使用了 Flask 的 @app.route 装饰器来定义不同的 URL 路径和 HTTP 方法。user_list 路由用于显示所有用户的列表,user_create 路由用于创建新用户,user_detail 路由用于显示用户的详细信息,user_delete 路由用于删除用户。每个路由都包含了处理 GET 和 POST 请求的逻辑,并且使用了模板来渲染 HTML 页面。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

不打赏也没关系,点点关注呀

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值