用 Flask 来写个轻博客 (8) — (M)VC_Alembic 管理数据库结构的升级和降级

简介: 目录目录前文列表扩展阅读Alembic查看指令 manager db 的可用选项初始化 DB Migrate开始第一次跟踪将记录文件应用到数据库中实时升级数据库结构回滚到某一个记录环境中前文列表用 Flask 来写个轻博客 (1)...

目录

前文列表

用 Flask 来写个轻博客 (1) — 创建项目
用 Flask 来写个轻博客 (2) — Hello World!
用 Flask 来写个轻博客 (3) — (M)VC_连接 MySQL 和 SQLAlchemy
用 Flask 来写个轻博客 (4) — (M)VC_创建数据模型和表
用 Flask 来写个轻博客 (5) — (M)VC_SQLAlchemy 的 CRUD 详解
用 Flask 来写个轻博客 (6) — (M)VC_models 的关系(one to many)
用 Flask 来写个轻博客 (7) — (M)VC_models 的关系(many to many)

扩展阅读

Openstack_SQLAlchemy 修改数据库的表结构
Openstack_SQLAlchemy_一对多关系表的多表插入实现

Alembic

大多数情况下,在开始实现一个新项目的代码之前都是先完成数据库的设计。但随着项目新功能的增加或需求变更,不可避免的数据模型的修改会贯穿项目开发的始终。这里会出现一个问题:当把这些数据模型的更新从开发环境迁移到生产环境时,怎样才能在保证原有数据完整性的情况下更新的数据库结构或将数据库回滚到之前的某一个时刻以便复现环境。

Alembic(Database migration 数据迁移跟踪记录) 提供的数据库升级和降级的功能,就可以帮我们解决上述的问题。它所能实现的效果有如 Git 管理项目代码一般。

  • 在这里我们使用 Flask 的扩展 Flask-Migrate
    NOTE:要在 virtualenv 的环境下安装
pip install Flask-Migrate
pip freeze > requirements.txt
  • 生成 manager db 指令
    在 manage.py 文件中 Create a new commands: manager.add_command("db", MigrateCommand)
from flask.ext.script import Manager, Server
from flask.ext.migrate import Migrate, MigrateCommand

import main
import models


# Init manager object via app object
manager = Manager(main.app)

# Init migrate object via app and db object
migrate = Migrate(main.app, models.db)

# Create some new commands
manager.add_command("server", Server())
manager.add_command("db", MigrateCommand)


@manager.shell
def make_shell_context():
    """Create a python CLI.

    return: Default import object
    type: `Dict`
    """
    return dict(app=main.app,
                db=models.db,
                User=models.User,
                Post=models.Post,
                Comment=models.Comment,
                Tag=models.Tag)

if __name__ == '__main__':
    manager.run()

查看指令 manager db 的可用选项

(env) [root@flask-dev JmilkFan-s-Blog]# python manage.py db
Perform database migrations

positional arguments:
  {upgrade,heads,merge,migrate,stamp,show,current,edit,init,downgrade,branches,history,revision}
    upgrade             Upgrade to a later version
    heads               Show current available heads in the script directory
    merge               Merge two revisions together. Creates a new migration file
    migrate             Alias for 'revision --autogenerate'
    stamp               'stamp' the revision table with the given revision; don't run any migrations
    show                Show the revision denoted by the given symbol.
    current             Display the current revision for each database.
    edit                Edit current revision.
    init                Creates a new migration repository
    downgrade           Revert to a previous version
    branches            Show current branch points
    history             List changeset scripts in chronological order.
    revision            Create a new revision file.

初始化 DB Migrate

(env) [root@flask-dev JmilkFan-s-Blog]# python manage.py db init
  Creating directory /opt/JmilkFan-s-Blog/migrations ... done
  Creating directory /opt/JmilkFan-s-Blog/migrations/versions ... done
  Generating /opt/JmilkFan-s-Blog/migrations/README ... done
  Generating /opt/JmilkFan-s-Blog/migrations/alembic.ini ... done
  Generating /opt/JmilkFan-s-Blog/migrations/env.py ... done
  Generating /opt/JmilkFan-s-Blog/migrations/script.py.mako ... done
  Generating /opt/JmilkFan-s-Blog/migrations/env.pyc ... done
  Please edit configuration/connection/logging settings in '/opt/JmilkFan-s-Blog/migrations/alembic.ini' before proceeding.

在初始化数据库更新任务之后会创建一个 migrations 目录,所有的更改记录文件(这个记录文件本来就是 Python 文件)都会被保存在该目录下。

开始第一次跟踪

(env) [root@flask-dev JmilkFan-s-Blog]# python manage.py db migrate -m "Initial migration"
INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.env] No changes in schema detected.

该指令会让 Alembic 扫描所有的 SQLAlchemy 对象,并将没有记录过的行和列记录成为一个 python 文件并保存到 migrations/versions 路径下。

将记录文件应用到数据库中(实时升级数据库结构)

NOTE 1: 执行该指令的前提是 migrations/versions 目录下必须存在记录文件。
NOTE 2: 而且这些记录文件是我们能够手动修改和创建的,这也是实时更新数据库结构的方法。将需要修改的数据库结构的更新内容,手动的写入到记录文件中,然后执行 upgrade 指令就能够实现数据库的更新,而且这些更新是可以批量的作用于数据库中,不需要使用一条一条的 SQL 语句来进行修改。

(env) [root@flask-dev JmilkFan-s-Blog]# python manage.py db upgrade
INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL

回滚到某一个记录环境中

用法于 Git 非常相似:

# 获取 History ID
(env) [root@flask-dev JmilkFan-s-Blog]# python manage.py db history


# 回滚到某个 history
(env) [root@flask-dev JmilkFan-s-Blog]# python manage.py db downgrade <history_id>
相关文章
|
3月前
|
JavaScript 前端开发 数据库
测试开发之路--Flask 之旅 (三):数据库
本文介绍了在 Flask 应用中实现权限管理的过程,包括使用 Flask-SQLAlchemy、Flask-MySQLdb、Flask-Security 和 Flask-Login 等扩展模块进行数据库配置与用户权限设置。首先创建数据库并定义用户、环境和角色模型,接着通过 Flask-Security 初始化用户和角色,并展示了如何便捷地管理权限。后续将深入探讨权限控制的具体应用。
79 4
测试开发之路--Flask 之旅 (三):数据库
|
2月前
|
监控 关系型数据库 MySQL
如何升级MySQL数据库?
【10月更文挑战第16天】如何升级MySQL数据库?
|
4月前
|
存储 消息中间件 人工智能
AI大模型独角兽 MiniMax 基于阿里云数据库 SelectDB 版内核 Apache Doris 升级日志系统,PB 数据秒级查询响应
早期 MiniMax 基于 Grafana Loki 构建了日志系统,在资源消耗、写入性能及系统稳定性上都面临巨大的挑战。为此 MiniMax 开始寻找全新的日志系统方案,并基于阿里云数据库 SelectDB 版内核 Apache Doris 升级了日志系统,新系统已接入 MiniMax 内部所有业务线日志数据,数据规模为 PB 级, 整体可用性达到 99.9% 以上,10 亿级日志数据的检索速度可实现秒级响应。
AI大模型独角兽 MiniMax 基于阿里云数据库 SelectDB 版内核 Apache Doris 升级日志系统,PB 数据秒级查询响应
|
4月前
|
数据采集 数据可视化 关系型数据库
【优秀python web设计】基于Python flask的猫眼电影可视化系统,可视化用echart,前端Layui,数据库用MySQL,包括爬虫
本文介绍了一个基于Python Flask框架、MySQL数据库和Layui前端框架的猫眼电影数据采集分析与可视化系统,该系统通过爬虫技术采集电影数据,利用数据分析库进行处理,并使用Echart进行数据的可视化展示,以提供全面、准确的电影市场分析结果。
151 4
|
4月前
|
数据采集 数据可视化 前端开发
基于python flask的旅游数据大屏实现,有爬虫有数据库
本文介绍了一个基于Python Flask框架开发的旅游数据大屏系统,该系统集成了爬虫技术、数据库存储和ECharts数据可视化,提供了一个全面、实时更新的旅游信息展示平台,旨在提升旅游行业用户体验和决策效率。
|
4月前
|
数据可视化 搜索推荐 数据挖掘
基于Python flask 的数据可视化平台,可定制,可连接数据库
本文介绍了一个基于Python Flask框架开发的可定制数据可视化平台,该平台支持多种数据库连接,并提供丰富的图表类型和个性化设置,以实现交互式数据分析和展示。
基于Python flask 的数据可视化平台,可定制,可连接数据库
|
4月前
|
SQL 测试技术 数据库
Flask与SQLAlchemy的神秘力量:如何让你的数据库飞起来?
【8月更文挑战第31天】在现代Web开发中,Flask和SQLAlchemy是热门技术栈,前者是轻量级Web框架,后者为强大的ORM库。本文介绍如何在Flask项目中集成SQLAlchemy,通过示例展示数据库操作方法,并分享最佳实践,如熟悉ORM、编写测试及适度使用SQL语句,以提升开发效率和代码质量。
263 0
|
5月前
|
Oracle 关系型数据库 数据库连接
|
5月前
|
关系型数据库 MySQL 测试技术
如何进行数据库的升级?
【7月更文挑战第21天】如何进行数据库的升级?
319 1
|
5月前
|
关系型数据库 MySQL 测试技术
数据库升级是一个涉及数据备份、新版本安装、数据迁移和测试等关键环节的复杂过程
【7月更文挑战第21天】数据库升级是一个涉及数据备份、新版本安装、数据迁移和测试等关键环节的复杂过程
141 1