您的位置:首页 > 数据库

10. 数据库迁移操作

2015-07-10 21:13 375 查看
上一篇中,处理数据库更新的方法需要将旧表删除,风险很大,这篇介绍一种优雅得多的解决办法:用Flask-Migrate实现数据库迁移。

更新表的更好方法是试用数据库迁移框架。源码版本控制工具可以跟踪源码文件的变化,类似地,数据库迁移框架能够跟踪数据库模式的变化,然后增量式地把变化应用到数据库中。

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的概览,更高级的功能会在后面慢慢接触。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: