在开发程序的过程中,你会发现有时需要修改数据库模型,而且修改之后还需要更新数据库。仅当数据库表不存在时,Flask-SQLAlchemy 才会根据模型进行创建。因此,更新表的唯一方式就是先删除旧表,不过这样做会丢失数据库中的所有数据。更新表的更好方法是使用数据库迁移框架。源码版本控制工具可以跟踪源码文件的变化,类似地,数据库迁移框架能跟踪数据库模式的变化,然后增量式的把变化应用到数据库中。

  SQLAlchemy 的主力开发人员编写了一个迁移框架,称为Alembic(https://alembic.readthedocs.org/en/latest/index.html)。除了直接使用Alembic 之外,Flask 程序还可使用Flask-Migrate(http://flask-migrate.readthedocs.org/en/latest/)扩展。这个扩展对Alembic 做了轻量级包装,并集成到Flask-Script 中,所有操作都通过Flask-Script 命令完成。

一.创建迁移仓库

  首先,我们要在虚拟环境中安装Flask-Migrate:

pip install flask-migrate

  这个扩展的初始化方法如下所示:

from flask.ext.migrate import Migrate, MigrateCommand
migrate = Migrate(app, db)
manager.add_command('db', MigrateCommand)

  为了导出数据库迁移命令,Flask-Migrate 提供了一个MigrateCommand 类,可附加到Flask-Script 的manager 对象上。在这个例子中,MigrateCommand 类使用db 命令附加。

  在维护数据库迁移之前,要使用init 子命令创建迁移仓库:

python hello.py db init
Creating directory /home/flask/flask1/migrations ... done
Creating directory /home/flask/flask1/migrations/versions ... done
Generating /home/flask/flask1/migrations/env.pyc ... done
Generating /home/flask/flask1/migrations/alembic.ini ... done
Generating /home/flask/flask1/migrations/README ... done
Generating /home/flask/flask1/migrations/script.py.mako ... done
Generating /home/flask/flask1/migrations/env.py ... done
Please edit configuration/connection/logging settings in
'/home/flask/flask1/migrations/alembic.ini' before proceeding.

  这个命令会创建migrations 文件夹,所有迁移脚本都存放其中。数据库迁移仓库中的文件要和程序的其他文件一起纳入版本控制。

二.创建迁移脚本

  在Alembic 中,数据库迁移用迁移脚本表示。脚本中有两个函数,分别是upgrade() 和downgrade()。upgrade() 函数把迁移中的改动应用到数据库中,downgrade() 函数则将改动删除。Alembic 具有添加和删除改动的能力,因此数据库可重设到修改历史的任意一点。

  我们可以使用revision 命令手动创建Alembic 迁移,也可使用migrate 命令自动创建。手动创建的迁移只是一个骨架,upgrade() 和downgrade() 函数都是空的,开发者要使用Alembic 提供的Operations 对象指令实现具体操作。自动创建的迁移会根据模型定义和数据库当前状态之间的差异生成upgrade() 和downgrade() 函数的内容。自动创建的迁移不一定总是正确的,有可能会漏掉一些细节。自动生成迁移脚本后一定要进行检查。

  migrate 子命令用来自动创建迁移脚本:

 python hello.py db migrate -m "initial migration"
INFO [alembic.runtime.migration] Context impl MySQLImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.autogenerate.compare] Detected removed table u'sys_user'
INFO [alembic.autogenerate.compare] Detected removed table u'sys_role_privilege'
INFO [alembic.autogenerate.compare] Detected removed table u'sys_role'
INFO [alembic.autogenerate.compare] Detected removed table u'sys_privilege'
INFO [alembic.autogenerate.compare] Detected removed table u'sys_dict'
INFO [alembic.autogenerate.compare] Detected removed table u'user info'
INFO [alembic.autogenerate.compare] Detected removed table u'country'
INFO [alembic.autogenerate.compare] Detected removed table u'sys_user_role'
Generating
/home/flask/flask1/migrations/versions/f52784fdd592_initial_migration.py ... done

三.更新数据库

  检查并修正好迁移脚本之后,我们可以使用db upgrade 命令把迁移应用到数据库中:

python hello.py db upgrade
INFO [alembic.runtime.migration] Context impl MySQLImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.runtime.migration] Running upgrade -> f52784fdd592, initial migration

  对第一个迁移来说, 其作用和调用db.create_all() 方法一样。但在后续的迁移中,upgrade 命令能把改动应用到数据库中,且不影响其中保存的数据。

  

  

最新文章

  1. 安装centos6.5如何选择安装包
  2. .netcore跨平台 之 windows上编译,ubuntu上运行
  3. 【整理】--C++变量概述
  4. git 教程(7)--撤销修改
  5. FIM相关报错汇总
  6. [CS231n-CNN] Convolutional Neural Networks: architectures, convolution / pooling layers
  7. linux包之procps之ps与top
  8. Rich控件一
  9. Android 百度地图 SDK v3.0.0 (二) 定位与结合方向传感器
  10. 201521123032 《Java程序设计》第4周学习总结
  11. centos7配置iscsi
  12. 配置nginx反向代理服务器,解决浏览器跨域调用接口的限制问题
  13. freemarker 中可以直接使用的内置对象
  14. 集合List
  15. phpstudy集成下Apache配置部署https安全证书
  16. Spark记录-Scala循环语句
  17. EasyUI 中GridView 满足某条件 改变行的背景色
  18. freetds 移植
  19. SQL2008无法连接到(local),该账户当前被锁定,所以Sa用户登陆失败
  20. CentOS6.4之图解SSH无验证双向登陆配置

热门文章

  1. Vue.js 2.0 跨域请求数据
  2. JMeter中用java修改文件名称
  3. 共享内存system v(未编译)
  4. Vim配置(转)
  5. springboot问题,没有主清单属性
  6. 右值引用和std::move函数(c++11)
  7. hB
  8. SPSS-比较均值-独立样本T检验 案例解析
  9. Java 原始类型JComboBox的成员JComboBox(E())的调用 未经过检查
  10. Google Maps 基础