关闭

10. 数据库迁移操作

标签: PythonFlaskSQLAlchemy数据库
1113人阅读 评论(1) 收藏 举报
分类:

上一篇中,处理数据库更新的方法需要将旧表删除,风险很大,这篇介绍一种优雅得多的解决办法:用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的概览,更高级的功能会在后面慢慢接触。

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:19395次
    • 积分:342
    • 等级:
    • 排名:千里之外
    • 原创:12篇
    • 转载:0篇
    • 译文:0篇
    • 评论:5条
    文章分类
    最新评论