10. 数据库迁移操作

原创 2015年07月10日 21:13:06

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

相关文章推荐

ODI_12C元数据库迁移恢复操作

  • 2017年07月17日 15:53
  • 540KB
  • 下载

11g与10g数据库迁移方法.docx

  • 2012年12月10日 17:12
  • 21KB
  • 下载

Oracle 10数据库迁移

需求:需要从一台机器linux机器A迁移到linux机器B,同时迁移后的数据库文件路不同。 操作步骤如下: 1.从A服务用scp的方式把以下目录拷过来。/opt/u01/app/o...

oracle10g-oracle11g的数据库迁移

  • 2012年04月01日 20:37
  • 18KB
  • 下载

Oracle数据库迁移操作指南

  • 2016年08月01日 10:42
  • 312KB
  • 下载

sql server 2005数据库迁移到oracle10g遇到的问题

今天在使用sql server 2005的数据导出功能做数据库迁移的时候遇到问题: 1. sql server 2005中 varchar类型最大长度是5000,但是在oracle中是4000,所以...
  • dljhf
  • dljhf
  • 2012年05月15日 15:44
  • 4732

数据库迁移,SqlServer2008R2迁移到ORA10g

数据库的数据量: 数据库的数据大约24G左右,一共有2000多张表,其中上百万条记录的表在25个左右,上千万条数据的表有一个。 工具: 使用的是SqlServer2008R2内置的SQL Ser...

Laravel数据库迁移(Database Migration)操作实例

很多人可能在学习Laravel框架的时候,对Laravel的数据库迁移(以下简称Migration)存在着疑惑:到底什么是Migration?为什么要用Migration?Migration到底方便在...
  • lgyaxx
  • lgyaxx
  • 2017年03月12日 11:14
  • 1737

数据库迁移(copy datafile方式)——从32位linux到64位linux实际操作

迁移前后环境 souce: 系统:redflag Asialinux 2 32bit        2.6.9-42.7AXsmp 数据库:oracle 32bit 11.2.0.1.0 IP...

oracle数据库迁移过程中的常见问题及常见操作命令

本文地址:http://blog.csdn.net/shanglianlm/article/details/56012849 数据库导出:使用sysdba 用户执行 create or replace...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:10. 数据库迁移操作
举报原因:
原因补充:

(最多只允许输入30个字)