用 Flask 来写个轻博客 (8) — (M)VC_Alembic 管理数据库结构的升级和降级
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog
目录
- 目录
- 前文列表
- 扩展阅读
- Alembic
- 查看指令 manager db 的可用选项
- 初始化 DB Migrate
- 开始第一次跟踪
- 将记录文件应用到数据库中(实时升级数据库结构)
- 回滚到某一个记录环境中
前文列表
用 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, MigrateCommandimport 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 objecttype: `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 migrationspositional arguments:{upgrade,heads,merge,migrate,stamp,show,current,edit,init,downgrade,branches,history,revision}upgrade Upgrade to a later versionheads Show current available heads in the script directorymerge Merge two revisions together. Creates a new migration filemigrate Alias for 'revision --autogenerate'stamp 'stamp' the revision table with the given revision; don't run any migrationsshow 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 repositorydowngrade Revert to a previous versionbranches Show current branch pointshistory 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 initCreating directory /opt/JmilkFan-s-Blog/migrations ... doneCreating directory /opt/JmilkFan-s-Blog/migrations/versions ... doneGenerating /opt/JmilkFan-s-Blog/migrations/README ... doneGenerating /opt/JmilkFan-s-Blog/migrations/alembic.ini ... doneGenerating /opt/JmilkFan-s-Blog/migrations/env.py ... doneGenerating /opt/JmilkFan-s-Blog/migrations/script.py.mako ... doneGenerating /opt/JmilkFan-s-Blog/migrations/env.pyc ... donePlease 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>
用 Flask 来写个轻博客 (8) — (M)VC_Alembic 管理数据库结构的升级和降级相关推荐
- 用 Flask 来写个轻博客 (37) — 在 Github 上为第一阶段的版本打 Tag
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 第一阶段结语 打 Tag 前文列表 用 Flask 来写个轻博客 (1 ...
- 用 Flask 来写个轻博客 (36) — 使用 Flask-RESTful 来构建 RESTful API 之五
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 PUT 请求 DELETE 请求 测试 对一条已经存在的 posts ...
- 用 Flask 来写个轻博客 (35) — 使用 Flask-RESTful 来构建 RESTful API 之四
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 POST 请求 身份认证 测试 前文列表 用 Flask 来写个轻博客 ...
- 用 Flask 来写个轻博客 (34) — 使用 Flask-RESTful 来构建 RESTful API 之三
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 应用请求中的参数实现 API 分页 测试 前文列表 用 Flask 来 ...
- 用 Flask 来写个轻博客 (33) — 使用 Flask-RESTful 来构建 RESTful API 之二
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 构建 RESTful Flask API 定义资源路由 格式 ...
- 用 Flask 来写个轻博客 (32) — 使用 Flask-RESTful 来构建 RESTful API 之一
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 RESTful API REST 原则 无状态原则 面向资源 ...
- 用 Flask 来写个轻博客 (31) — 使用 Flask-Admin 实现 FileSystem 管理
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 编写 FileSystem Admin 页面 Flask-A ...
- 用 Flask 来写个轻博客 (30) — 使用 Flask-Admin 增强文章管理功能
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 实现文章管理功能 实现效果 前文列表 用 Flask 来写个 ...
- 用 Flask 来写个轻博客 (29) — 使用 Flask-Admin 实现后台管理 SQLAlchemy
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 Flask-Admin BaseView 基础管理页面 Mo ...
最新文章
- iOS UIButton 图片文字上下垂直布局 解决方案
- python 柱状图-【python】【数据分析】3D柱状图就是这么好看
- VMware Workstation 与 Device/Credential Guard 不兼容。在禁用 Device/Credenti
- html一个div调用的一个php页面,打开一个HTML文件,一个div/iframe中内PHP
- oracle 12c 取消omf,Oracle12c创建及删除PDB
- 36.MySQY 常用工具
- 这几招教你如何增加食物中铁的吸收
- CSS3 高级教程之动画定义和使用
- macos系统镜像iso_系统原装ISO镜像软碟通刻录启动U盘教程
- selenium Gird
- 让你相见恨晚的PS技巧分享
- CDN流量是什么,怎么计算?
- linux 如何让程序后台执行
- Android 8.0 - AccountManager之行为变更
- java集合相关的习题及解析
- mysql got signal 11_从库crash一直自动重启(mysqld got signal 11)问题解决
- tensorflow英语怎么读_tensorflow怎么读
- 2017十大网络黑客攻击事件丨阿里云河南
- 人工智能全球发展趋势、经济影响和未来挑战
- Python 文本对话框提示框 + 文件夹选择框 如何实现
热门文章
- vue开发页面自适应_vue-cli 【flexible】屏幕字体自适应布局及配置
- unity 200.8m yoy_没错,Unity双十一来了
- mediumtext_mediumtext数据类型 | 学步园
- Stack Overflow被腾讯最大股东收购,影响我复制粘贴代码吗?
- 曾在字节实习的程序员小姐姐,教你一步提取动漫线稿!比用PS更清晰
- 一位中国博士把整个CNN都给可视化了,可交互有细节,每次卷积ReLU池化都清清楚楚...
- 微软公布19财年财报:净利润增长22%,云计算首超个人计算业务
- 网站性能调优开发工具: Lighthouse, Puppeteer 以及进阶部分丨 Google 开发者大会 2018...
- vue 巧用过渡效果
- 微信小程序实践_4显示新闻(2)