当前位置: 首页 > news >正文

从零开始搭建 flask 博客实验(3)

  本文主要聚焦于将数据库整合进 Flask 博客项目中,使用 MySQL + SQLAlchemy + Flask-Migrate  的组合。本文将从“为什么”“如何配置”“模型设计”“数据操作”四个维度,整理并总结这篇教程的核心内容,同时分享几个实践中的小建议。

一、为什么要在博客项目中使用数据库

作为一个完整的博客系统,数据持久化能力是必不可少的:文章、用户、评论、标签、分类……这些都需要存储、检索、修改。作者指出,虽然很多教程使用 SQLite,但他决定用 MySQL 来做演示。 CSDN博客

使用 MySQL 的好处包括:

  • 生产环境更常见,对规模、并发、连接数会更有保障;

  • 配合 ORM(如 SQLAlchemy)更容易扩展;

  • 使用迁移工具(如 Flask‑Migrate)可以方便地管理数据库变更。

所以,如果你的博客有可能演变为一个长期维护、功能增长的项目,从一开始就选好数据库是明智的。

二、环境准备与配置步骤

作者的环境准备流程清晰:

  1. 安装 Flask SQLAlchemy:pip install flask-sqlalchemy。 CSDN博客

  2. 安装 Flask-Migrate:pip install flask-migrate。 CSDN博客

  3. 安装 PyMySQL,因为 Python3 不再自带 MySQLdb:pip install pymysql

SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123456@localhost:3306/flaskblog?charset=utf8'
SQLALCHEMY_TRACK_MODIFICATIONS = False
``` :contentReference[oaicite:7]{index=7}  

app/__init__.py 中初始化 Flask 应用、SQLAlchemy、Migrate:

from flask import Flask
from config import Config
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrateapp = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)
migrate = Migrate(app, db)from app import routes, models
``` :contentReference[oaicite:8]{index=8}  

在 app/__init__.py 中初始化 Flask 应用、SQLAlchemy 和 Migrate,是 Python Web 开发中非常基础且重要的步骤,它们分别对应「Web 应用核心」「数据库操作工具」「数据库迁移工具」。我们一步步拆解它们的作用和初始化逻辑:

1. 先理解这三个东西到底是啥?

  • Flask 应用:Flask 是一个轻量级的 Web 框架,相当于一个「容器」,用来管理你的网页路由(比如访问 /login 对应哪个函数处理)、模板渲染、请求响应等核心 Web 功能。没有它,就没有 Web 应用的基础。
  • SQLAlchemy:一个「数据库工具包」,它能让你用 Python 代码(而非直接写 SQL)来操作数据库(比如增删改查数据)。比如你想往 user 表加一条数据,不用写 INSERT INTO user ...,直接用 User(name="xxx").save() 这种 Python 语法就行,更简单且跨数据库(换 MySQL/PostgreSQL 不用改代码)。
  • Migrate(Flask-Migrate):基于 SQLAlchemy 的「数据库迁移工具」。当你后期修改数据库结构(比如给表加个新字段、改字段类型)时,它能帮你自动同步这些变化到数据库,避免手动删表重建(防止数据丢失)。

2. 为什么要在 app/__init__.py 中初始化?

__init__.py 是 Python 包的标识文件,当你用 from app import ... 导入时,会先执行这个文件里的代码。把初始化逻辑放这里,主要是为了:

  • 让整个项目的核心组件(Flask 应用、数据库工具)集中管理,方便其他模块(比如路由、模型)导入使用。
  • 避免循环导入问题(比如路由文件需要导入 Flask 应用,应用初始化又需要用到路由,放这里能解耦)。
  • 三、模型设计与表关系

文章中接着讲了如何在 models.py 中设计数据库模型,也就是 ORM 层。 CSDN博客

关键点包括:

  • 模型类继承 db.Model,定义字段、关系、方法。

  • 使用 Flask-Migrate 管理迁移:先 db init,再 db migrate,最后 db upgrade(尽管文章在这一篇里可能没详述,但这是常规流程)。

  • 建立“一对多”关系作为博客系统中常见的表关联方式(用户→文章、文章→评论等)。

  • 模型设计应考虑可扩展性,例如用户表中可能有头像、简介、注册时间等;文章表可能有标题、正文、发布时间、作者、标签、分类等。

小建议

  • 在博客系统设计中,标签(tags)和分类(category)往往是多对多的关系,建议在设计阶段思考好。

  • 给模型添加 __repr__ 方法对于调试很有帮助。

  • 常用字段如 created_at, updated_at 可以通过基类统一管理。

四、数据操作与数据库迁移

在模型建好之后,接下来是数据的增删改查操作,以及迁移脚本管理。文章中提到了如何进行这些操作,从模型到数据库的同步。 CSDN博客

迁移工具 Flask-Migrate/Alembic 的使用,使得在开发中修改模型(如新增字段)不再需要手动去数据库操作,而是通过版本化的脚本来处理。作者展示了如何使用这些工具。

小建议

  • 在每次模型修改后,务必先在开发环境运行 db migratedb upgrade,确认无误后再部署到生产。

  • 在生产环境部署之前,建议先备份数据库。

  • 对于删除字段或修改字段类型等破坏性更改,要格外小心,可能需要额外迁移步骤或数据迁移脚本。


五、总结与感想

通过第三篇教程,作者将博客项目从“有前端 + 路由”阶段,推进到“有数据库支持”的完整阶段。这是一个重要里程碑:一个真实可用的博客系统离不开数据存储。

我个人的几点收获:

  • 从实践来看,尽早决定好数据库方案有利于后续功能扩展。

  • 模型设计阶段不要拖延,越早清晰定义结构,对后续开发越有益。

  • 使用 migration 工具不仅是好习惯,也几乎是必备。

  • 虽然教程以 MySQL 为例,但在开发初期采用 SQLite + 再切换策略也很常见。

如果你正在着手用 Flask 做博客或 Web 应用,这篇文章是值得细读并 “动手跟做” 的。下一篇(教程第四篇)预计会讲更多功能(如用户系统、登录、权限、文章管理等),敬请期待。

--------------------------------------------------------------------------------------------------------------------------------

-----------------疑难解答-------------------

from flask import Flask from config import Config from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate app = Flask(__name__) app.config.from_object(Config) db = SQLAlchemy(app) migrate = Migrate(app, db) from app import routes, models 此时 Flask 已经和 MySQL“握手成功”。 还是不理解工作原理,怎么就联上了

我来一步步拆开,讲清楚——为什么写几行 db = SQLAlchemy(app)migrate = Migrate(app, db),Flask 就能“握手成功”。


🧩 一、Flask 是“中间人”

当你创建 Flask 应用:

app = Flask(__name__)

这行代码只是启动了一个“Web 框架容器”,它本身并不知道数据库的存在

接下来:

 

app.config.from_object(Config)

你往 Flask 的“配置字典”里放了数据库的连接信息,比如:

 

SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123456@localhost:3306/flaskblog'

Flask 只是保存了这条字符串,它自己不会去连 MySQL。


⚙️ 二、SQLAlchemy 是“数据库翻译器”

当你写:

db = SQLAlchemy(app)

这一刻非常关键,发生了几件事:

  1. SQLAlchemy() 是 Flask-SQLAlchemy 提供的一个类;

  2. 它会从 app.config 里读取上面的 SQLALCHEMY_DATABASE_URI

  3. 它用 SQLAlchemy 的 Engine(引擎)对象 创建数据库连接;

  4. 这个 Engine 会调用底层驱动 pymysql(就是你安装的那个库),通过 TCP/IP 协议和 MySQL 建立连接;

  5. 一旦连接成功,db 就是一个“ORM 工厂”:

    • 它能帮你把类 → 表;

    • 对象 → 行;

    • 属性 → 列。

也就是说,db = SQLAlchemy(app) 做了这件事:

🧠 “从 Flask 读取配置 → 创建数据库引擎 → 建立连接 → 注册 ORM 上下文。”


🧱 三、Migrate 是“数据库版本控制器”

 

migrate = Migrate(app, db)

这一行并不会立即连接数据库。
它只是帮你注册好一个“迁移管理器”,以后当你运行:

 

flask db init flask db migrate flask db upgrade

这些命令时,Migrate 就能自动找到 appdb,知道该连接哪一个数据库,并同步你的模型变更。


🧬 四、当你导入 models 时,ORM 注册模型

 

from app import routes, models

models.py 被导入时,你的模型定义(例如):

class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(64))

会自动注册到 SQLAlchemy 的“元数据(metadata)”系统中。

到这一步,数据库引擎 + 模型映射 + 应用上下文都已经在内存中绑定完成。


🧠 五、真正的“握手时刻”

当你第一次执行:

flask db upgrade

或在 shell 中执行:

db.create_all()

这时候,SQLAlchemy 调用底层引擎:

  • 读取配置中的数据库地址;

  • 调用 PyMySQL 打开 TCP 连接(例如 127.0.0.1:3306);

  • 发送 CREATE TABLE / INSERT 等 SQL;

  • MySQL 返回确认。

这就是“握手成功”的那一瞬间。
连接是通过 数据库驱动(PyMySQL) 实际建立的。


🪄 六、一句总结

层次职责
Flask提供应用上下文和配置
Flask-SQLAlchemy读取配置并创建数据库连接
SQLAlchemyORM 映射引擎,负责把 Python 类转成 SQL
PyMySQL真正执行 SQL、连接 MySQL 的驱动
Flask-Migrate追踪 ORM 变化并生成迁移脚本

所以你看到的那行“看似简单”的代码,其实背后是五层机制的协同。
Flask 自己不会连 MySQL,是 Flask-SQLAlchemy 帮你创建了引擎,并注册进 Flask 的上下文

http://www.dtcms.com/a/574596.html

相关文章:

  • 使用 Python 解释 Telegram 被封禁的原因(附中文版与中文群组频道搜索机器人示例)
  • Rust 练习册 3:深入理解闭包(Closure)
  • 官方网站制作wordpress 镜像
  • C语言应用实例:解方程(二分查找)
  • t想学网站建设石家庄专业建站公司
  • 基础数据结构之数组的双指针技巧之对撞指针(两端向中间):三数之和(LeetCode 15 中等题)
  • 网站鼠标悬停动态效果代码网站一个月
  • ASP.NET网站建设实战网络推广的方式有哪些?
  • 防止缓存穿透
  • 防火墙培训
  • 李宏毅机器学习笔记40
  • 网站开发甲方需求文档华为手机网络营销方式
  • 许昌旅游网站建设现状室内设计师联盟网站
  • 做公众号排版的网站常见的网络营销形式有哪些
  • AXI总线专题-AXI转SPI(接口)
  • 甘肃兴华建设集团网站怎么搭建一个视频网站
  • 珠海手机网站建设公司wordpress 数据库 备份
  • wordpress可以卸载360网站seo手机优化软件
  • 南山区住房和建设局网站莱芜都市网二手车租车
  • 中国建设银行网站查询密码是什么意思网站子页面怎么做的
  • 企业手机网站建设方案怎么自己建设一个网站
  • 集群网络技术2:流量控制与拥塞管理PFC ECN/DCQCN
  • 制作类网站哪里做网络推广
  • Spring Boot中使用Quartz实现动态定时任务
  • 2.4 python装饰器在 Web 框架和测试中的实战应用
  • 从容器化到自动化:Spring Boot 项目 Docker 部署与 GitLab CI/CD 集成 Harbor 全流程
  • 基于springboot的web的音乐网站开发与设计
  • AIIData数据中台商业版+开源版双模式
  • 音画同步革命:IndexTTS2深度解析——B站开源的情感化+时长可控TTS新标杆
  • 如果做淘宝网站wordpress 七牛视频播放