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的概览,更高级的功能会在后面慢慢接触。

MySQL数据库的迁移——使用*.sql文件操作方式

1. 概述 MySQL数据库的导入,有两种方法: 1) 先导出数据库SQL脚本,再导入; 2) 直接拷贝数据库目录和文件。 在不同操作系统或MySQL版本情况下,直接拷贝文件的方法可能会有不兼容的情...
  • zhangliu1982
  • zhangliu1982
  • 2014年04月23日 13:09
  • 2259

不同平台之间的 DB2 数据库迁移一例

关于数据库迁移,如果操作系统相同,例如从 Windows 系统迁移到 Windows 系统,或者从 AIX 系统迁移到 AIX 系统都比较好处理,一般使用 BACKUP 和 RESTORE 命令就可以...
  • gold_star
  • gold_star
  • 2016年05月24日 15:41
  • 1491

sybase数据库的两种简单迁移方法

新上了一套sybase数据库,需要做数据迁移工作,由于可以申请周末停机时间,因此可以选择如下两种方案,方法都比较简单,同sqlserver很类似 方法1:dump和load方法,本质上是备份...
  • hijk139
  • hijk139
  • 2014年02月28日 10:52
  • 7027

Sqoop学习笔记——关系数据库与hdfs间数据迁移

一、安装: 上传到hadoop集群的某一个节点上,将sqoop压缩包解压即可直接使用;   二、配置: 将需要连接的数据库(比如Oracle、MySQL)的连接驱动拷贝到 sqoop目录的lib里;...
  • lsxy117
  • lsxy117
  • 2015年08月03日 15:31
  • 2695

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

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

oracle10g-oracle11g的数据库迁移

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

ODI_12C元数据库迁移恢复操作

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

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
  • 4816

从Sql server 2000往Oracle 10g数据库迁移遇到的问题

从Sql server 2000往Oracle 10g数据库迁移遇到的问题 博客分类: eclipse rcp SQL ServerSQLOracleHibernateStruts ...
  • WTK870424
  • WTK870424
  • 2013年03月04日 13:25
  • 1036
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:10. 数据库迁移操作
举报原因:
原因补充:

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