简介:数据库模式的变更是后端开发中不可避免的一部分。传统的 db.create_all() 方法在处理数据库迁移时无法实时处理数据库模式的变更。Flask应用每次运行可以检测新的数据库对象,即表的添加,但对于某张表的字段变更等场景无法检测。这时,Flask-Migrate 插件就显得尤为重要。它不仅能够帮助开发者轻松管理数据库的版本,还能自动化处理数据库模式的变更,极大地提高了开发效率和项目的可维护性。
目录:
一、db.create_all() 的局限性 二、Flask-migrate插件的更多细节 2.1 基本介绍与功能 2.2 安装、配置与迁移应用 三、实战应用实例 四、结束语
🚀 读完本文,你将解锁以下超实用技能和知识储备:
- 深入理解数据库迁移的概念及其重要性:掌握数据库迁移的基本原理,理解在项目开发中如何通过迁移管理数据库结构的变更,以及这些变更对项目维护和扩展的影响。
- 掌握 Flask-Migrate 插件的集成与使用:学会如何在 Flask 项目中安装、配置和集成 Flask-Migrate 插件,包括初始化迁移环境、生成迁移脚本和应用迁移。
- 创建和管理迁移脚本:掌握如何使用 Flask-Migrate 插件创建迁移脚本,以及如何应用这些脚本来更新数据库结构。同时,学会如何回滚迁移,以应对错误或需要恢复到之前状态的情况。
- 实现数据库的版本控制:能够在实际项目中使用 Flask-Migrate 插件,通过版本控制机制管理数据库结构的变更,确保项目的可维护性和可扩展性。
一、db.create_all() 的局限性
在 Flask 项目中,db.create_all() 是一个常用的命令,用于创建数据库表。在先前的文档以及应用中,我采用这个方法进行数据库对象的创建,因为暂时不涉及数据库的变更,仅仅为了了解ORM模型使用。然而,随着项目的复杂度增加,db.create_all() 的局限性逐渐显现,主要如下:
为了解决这些问题,我们需要一个更强大的工具来管理数据库迁移。这就是 Flask-Migrate 插件。
二、Flask-migrate插件的更多细节
2.1 基本介绍与功能
Flask-Migrate 是一个基于 Alembic 的 Flask 扩展,用于处理数据库迁移。它提供了以下核心功能:
2.2 安装、配置与迁移应用
- 安装 Flask-Migrate
首先,需要安装 Flask-Migrate 插件。在终端中运行以下命令:
pip install Flask–Migrate
- 配置 Flask-Migrate
在 Flask 应用中,需要初始化 Flask-Migrate 插件。以下是一个示例代码:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = '*****'# 数据库基础配置
db = SQLAlchemy(app)
migrate = Migrate(app, db) # (关键配置,在前述文章代码基础上进行添加即可)
上述代码中,在配置好数据库信息以及创建数据库对象后,需要额外添加一行代码migrate = Migrate(app, db),数据库的相关配置及用法可以参考我之前的博客文章:python+flask后端开发~进阶系列 | 对象关系映射ORN模型与数据库→表之间的映射
- 创建迁移脚本
使用以下命令创建迁移脚本:
flask db init # 用于初始化迁移环境
flask db migrate –m "Initial migration." # 用于生成迁移脚本
上述命令在终端执行,初始化迁移环境用的代码flask db init只需执行一次,后续无需再次执行。
- 应用迁移
使用以下命令应用迁移脚本:
flask db upgrade
上述代码在终端执行,用于实时检测数据库相关代码的修改,并将其同步到数据库中
- 回滚迁移
如果需要回滚到之前的版本,可以使用以下命令:
flask db downgrade
同样,上述代码在终端执行,用于返回之前的数据库版本。
三、实战应用实例
以下是一个完整的示例,展示如何在 Flask 项目中使用 Flask-Migrate 插件。
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
app = Flask(__name__)
# MySQL 所在的主机名
HOSTNAME = "127.0.0.1"
# MYSQL 监听的端口号,默认3306
PORT = 3306
# 连接MySQL的用户名,读者用自己设置的
USERNAME = "root"
# 连接 MYSQL的密码,读者用自己的
PASSWORD = "8848dd"
# MYSQL上创建的数据库名称
DATABASE = "backdb_test"
app.config['SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charsetut-8mb4"
# 在app.config中设置连接数据库的基本信息
# 然后使用SQLAlchemy(app)创建一个db对象
# SQLAlchemy会自动读取app.config中的配置信息
db = SQLAlchemy(app)
migrate = Migrate(app, db)
class User(db.Model):
# 创建一个表,名为user,可自定义
__tablename__ = "user"
# 添加主键字段,并定义了类型、主键、自增
id = db.Column(db.Integer, primary_key = True, autoincrement = True)
# 添加字段,并指定字符长度,非空
username = db.Column(db.String(100), nullable = False)
password = db.Column(db.String(100), nullable = False)
articles = db.relationship("Article", back_populates="author")
class Article(db.Model):
# 创建一个表,名为user,可自定义
__tablename__ = "article"
# 添加主键字段,并定义了类型、主键、自增
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
title = db.Column(db.String(200), nullable=False)
content = db.Column(db.Text, nullable=False)
# 添加作者的外键
author_id = db.Column(db.Integer, db.ForeignKey("user.id"))
# 创建属性与其它对象的关系
author = db.relationship("User", back_populates="articles")
# author = db.relationship("User", backref="articles")
初始化迁移环境:
生成迁移脚本: 同时,在数据库中自动生成一个用于记录数据库版本号的新表alembic _version,打开后为空,是因为并没有执行更新命令,此刻相关有关于数据库的相关代码更正并未同步到数据库中。
应用迁移: 此刻,相关更正已同步至数据库中,数据库的alembic _version表中记录了第一条版本信息。
(可选)回滚迁移:
如果需要回滚到之前的版本,可以在终端使用以下命令:
flask db downgrade
由于我并没有修改数据库,这里不作演示,大家可以自行尝试!!!
四、结束语
通过本文的介绍,你已经掌握了如何在 Flask 项目中使用 Flask-Migrate 插件来管理数据库迁移。Flask-Migrate 不仅能够自动检测数据库模式的变更,还能通过版本控制机制轻松管理数据库的版本。
希望这些知识和技能能够帮助你在实际项目中更高效地管理数据库,提升开发效率和项目的可维护性。
最后,感谢你的阅读!如果你觉得本文对你有帮助,不妨点赞和关注,我会继续分享更多关于 Python 和 Flask 开发的实用知识。🚀
关注专栏,每周更新,带你从“第一个 Flask 项目”一路进阶到“Docker 部署、JWT 鉴权、微服务拆分”。
版权归作者所有,未经许可请勿抄袭,套用,商用(或其它具有利益性行为)。
– 欢迎扫码关注:华北理工大学低碳与智能冶金实验室
评论前必须登录!
注册