10. 数据库迁移操作
2015-07-10 21:13
375 查看
上一篇中,处理数据库更新的方法需要将旧表删除,风险很大,这篇介绍一种优雅得多的解决办法:用Flask-Migrate实现数据库迁移。
更新表的更好方法是试用数据库迁移框架。源码版本控制工具可以跟踪源码文件的变化,类似地,数据库迁移框架能够跟踪数据库模式的变化,然后增量式地把变化应用到数据库中。
SQLAlchemy的主力开发人员编写了一个迁移框架,叫Alembic。除了直接试用Alembic之外,Flask程序还可以用Flask-Migrate扩展。这个扩展对Alembic做了轻量级包装,并且集成到Flask-Script中,所有操作都通过Flask-Script命令完成。
介绍就是这些,下面动手敲代码。
1、创建迁移仓库
先在虚拟环境中安装Flask-Migrate:
在hello.py文件中配置Flask-Migrate:
在维护数据库迁移之前,要使用init子命令创建迁移仓库:
这个命令创建了migrations文件夹,所有的迁移脚本都存放在里面。
2、创建迁移脚本(Migration Script)
在Alembic中,数据库迁移用迁移脚本表示。脚本中有两个函数,分别是upgrade()和downgrade()。upgrade()函数把迁移中的改动应用到数据库中,downgrade()函数则将改动删除。Alembic具有添加和删除改动的功能,因此数据库可重设到修改历史的任一点。自动创建的迁移会根据模型定义和数据库当前状态之间的差异生成upgrade()和downgrade()函数的内容。
migrate 子命令用来自动创建迁移脚本:(此命令需要将data.sqlite文件删除方可正常执行)
执行完这个命令后,去查看migrations/versions/文件夹,会发现创建了1ff2bdaa86ff_initial_migration.py脚本文件,就是传说中的迁移脚本(Migration Script)
3、更新数据库
检查并修正好迁移脚本后,我们可以用 db upgrade 命令把迁移应用到数据库中:
对第一个迁移来说,其作用和调用db.create_all()方法一样。但在后续的迁移中,upgrade命令能把改动应用到数据库中,且不影响其中保存的数据。
到此,完成了基础部分对数据库框架SQLAlchemy的概览,更高级的功能会在后面慢慢接触。
更新表的更好方法是试用数据库迁移框架。源码版本控制工具可以跟踪源码文件的变化,类似地,数据库迁移框架能够跟踪数据库模式的变化,然后增量式地把变化应用到数据库中。
SQLAlchemy的主力开发人员编写了一个迁移框架,叫Alembic。除了直接试用Alembic之外,Flask程序还可以用Flask-Migrate扩展。这个扩展对Alembic做了轻量级包装,并且集成到Flask-Script中,所有操作都通过Flask-Script命令完成。
介绍就是这些,下面动手敲代码。
1、创建迁移仓库
先在虚拟环境中安装Flask-Migrate:
(venv) $ pip install flask-migrate
在hello.py文件中配置Flask-Migrate:
from flask.ext.migrate import Migrate, MigrateCommand #... migrate = Migrate(app, db) #初始化应用程序和数据库 manager.add_command('db', MigrateCommand) #将MigrateCommand类附加到Flask-Script的manager对象上
在维护数据库迁移之前,要使用init子命令创建迁移仓库:
(venv) $ python hello.py db init (这是在Windows系统上的演示) Creating directory e:\Python27\Flask\flasky\migrations ... done Creating directory e:\Python27\Flask\flasky\migrations\versions ... done Generating e:\Python27\Flask\flasky\migrations\alembic.ini ... done Generating e:\Python27\Flask\flasky\migrations\env.py ... done Generating e:\Python27\Flask\flasky\migrations\env.pyc ... done Generating e:\Python27\Flask\flasky\migrations\README ... done Generating e:\Python27\Flask\flasky\migrations\script.py.mako ... done Please edit configuration/connection/logging settings in \ 'e:\\Python27\\Flask\\flasky\\migrations\\alembic.ini' before proceeding.
这个命令创建了migrations文件夹,所有的迁移脚本都存放在里面。
2、创建迁移脚本(Migration Script)
在Alembic中,数据库迁移用迁移脚本表示。脚本中有两个函数,分别是upgrade()和downgrade()。upgrade()函数把迁移中的改动应用到数据库中,downgrade()函数则将改动删除。Alembic具有添加和删除改动的功能,因此数据库可重设到修改历史的任一点。自动创建的迁移会根据模型定义和数据库当前状态之间的差异生成upgrade()和downgrade()函数的内容。
migrate 子命令用来自动创建迁移脚本:(此命令需要将data.sqlite文件删除方可正常执行)
(venv) $ python hello.py db migrate -m 'initial migration' INFO [alembic.migration] Context impl SQLiteImpl. INFO [alembic.migration] Will assume non-transactional DDL. INFO [alembic.autogenerate.compare] Detected added table 'roles' INFO [alembic.autogenerate.compare] Detected added table 'users' INFO [alembic.autogenerate.compare] Detected added index 'ix_users_username' on '['username']' Generating e:\Python27\Flask\flasky\migrations\versions\1ff2bdaa86ff_initial_migration.py ... done
执行完这个命令后,去查看migrations/versions/文件夹,会发现创建了1ff2bdaa86ff_initial_migration.py脚本文件,就是传说中的迁移脚本(Migration Script)
3、更新数据库
检查并修正好迁移脚本后,我们可以用 db upgrade 命令把迁移应用到数据库中:
(vnev) $ python hello.py db upgrade INFO [alembic.migration] Context impl SQLiteImpl. INFO [alembic.migration] Will assume non-transactional DDL. INFO [alembic.migration] Running upgrade None -> 1ff2bdaa86ff, initial migration
对第一个迁移来说,其作用和调用db.create_all()方法一样。但在后续的迁移中,upgrade命令能把改动应用到数据库中,且不影响其中保存的数据。
到此,完成了基础部分对数据库框架SQLAlchemy的概览,更高级的功能会在后面慢慢接触。
相关文章推荐
- 收集统计信息脚本
- MySQL用户权限
- 数据类型和运算符(三)
- mysql 随机更新表里的几条数据
- MySQL表损坏:Table XXX is marked as crashed and should be repaired
- 查询复杂sql的表的大小
- MySQL的触发器创建之注意事项(有关delimiter)
- 【转】IBatis.Net项目数据库SqlServer迁移至Oracle
- 写sql语句连接的时候注意的一个小细节
- Oracle中的函数 字符串、数字、日期
- sqlite3插入日期时间出错解决
- ORACLE查看数据文件包含哪些对象
- 数据库排名sql,group by 分组查询按照时间最大值
- update慢如何处理?
- winfrom连接数据库增删改查写法
- Oracle 11g Pivot函数实现行转列
- 查看Oracle自动优化建议
- orcale sql常用语句
- SQL Server 导入 MDF LDF文件
- [c#]从数据库中用ExecuteScalar()读取值使用(int)强制类型转换发生System.InvalidCastException: 指定的转换无效