云计算百科
云计算领域专业知识百科平台

python+flask后端开发~进阶系列 | Flask-migrate插件:实现ORM模型的迁移

在这里插入图片描述 简介:数据库模式的变更是后端开发中不可避免的一部分。传统的 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() 的局限性逐渐显现,主要如下:

  • 无法处理数据库模式的变更:db.create_all() 只能创建新的表,而无法处理表结构的变更,如添加、删除或修改字段。
  • 无法版本控制:db.create_all() 没有版本控制机制,一旦数据库结构发生变化,很难回溯到之前的版本。
  • 缺乏自动化:每次数据库结构变更都需要手动执行 db.create_all(),这不仅繁琐,还容易出错。
  • 为了解决这些问题,我们需要一个更强大的工具来管理数据库迁移。这就是 Flask-Migrate 插件。

    二、Flask-migrate插件的更多细节

    2.1 基本介绍与功能

    Flask-Migrate 是一个基于 Alembic 的 Flask 扩展,用于处理数据库迁移。它提供了以下核心功能:

  • 自动检测数据库模式变更:通过比较数据库的实际结构和模型定义,自动生成迁移脚本。
  • 版本控制:支持数据库的版本控制,可以轻松地在不同版本之间切换。
  • 自动化迁移:提供命令行工具,可以自动应用迁移脚本,简化数据库管理流程。
  • 2.2 安装、配置与迁移应用

    • 安装 Flask-Migrate

    首先,需要安装 Flask-Migrate 插件。在终端中运行以下命令:

    pip install FlaskMigrate

    • 配置 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 插件。

  • 创建Flask应用(相关依赖均已安装):
  • 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 鉴权、微服务拆分”。

    版权归作者所有,未经许可请勿抄袭,套用,商用(或其它具有利益性行为)。

    – 欢迎扫码关注:华北理工大学低碳与智能冶金实验室 在这里插入图片描述

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » python+flask后端开发~进阶系列 | Flask-migrate插件:实现ORM模型的迁移
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!