alembic 使用

使用Alembic迁移数据库

Alembic是SQLAlchemy作者编写的Python数据库迁移工具。我打算用它实现模型类和数据库的同步更新,就先看了些资料,学习如何实现该功能。

1. 安装

我在virtualenv下直接通过pip安装,会自动安装依赖包SQLAlchemy、Mako和MarkupSafe。

SAE Python环境中只需安装Mako,其他两个均为内置模块。

安装完成后就可以使用alembic命令,所有Alembic操作均由该命令实现(感觉类似git)。

2. 初始化

需要为alembic初始化,这将创建一个alembic.ini配置文件和一个alembic“档案”目录。在合适的位置运行

我在模块包目录下创建目录alembic_database,目录结构如下:

3. 创建模型类

创建一个使用SQLAlchemy定义数据库的模块,比如下面这种

上面例子中定义一个表user。

4. 修改配置文件

在alembic.ini中设置数据库连接

为了使用模型类更新数据库,需要在env.py中设置,将target_metadata赋值成数据库的元数据(metadata)。原有配置如下

可修改为

自此,alembic将可以获取模型模块中定义的信息。

5. 创建版本

用 alembic revision -m+注释 创建数据库版本。由于我提供了模型类,所以可以用–autogenerate参数自动生成迁移脚本。运行

显示

生成的数据库迁移脚本如下:

两个函数用于数据库的升级和降级。

6. 更新数据库

升级数据库使用alembic upgrade,降级使用alembic downgrade。更新到最新版

查看数据库,发现已经创建user表。还有一个表叫做alembic_version,只有一个字段和一个值version_num,记录当前的数据库版本。

我在SAE Python本地开发环境中使用遇到问题,代码中使用pylibmc库,但SAE Python本地开发环境用sae.memcache模块代替pylibmc模块,dev_server.py中有下面的代码

直接使用pylibmc在dev_server.py下没有问题,但运行alembic程序时则会提示找不到该模块。为了解决这个问题,我判断是本地开发环境还是线上开发环境,分别载入不同的库。

参考

alembic官方教程 http://alembic.readthedocs.org/en/latest/tutorial.html

《Alembic 简明教程》http://huangx.in/18/alembic-simple-tutorial

《使用alembic》 http://my.oschina.net/banxi/blog/126695

sqlalchemy-migrate 另一款适用于SQLAlchemy的数据库迁移工具

问题

SAE线上环境使用的SQLAlchemy版本为0.7.10,使用Alembic时出现如下错误:

似乎对MetaData的支持不够,版本号过低。升级成0.8.5,就可以正常使用。

重新生成脚本

我使用Alembic时,已经使用SQLAlchemy建立初始模型的数据表,不是从零开始,所以无法使用Alembic完整迁移数据库。所以,我使用Alembic重新生成数据库迁移脚本。

Alembic在数据库中仅保存当前版本号,其余信息均从文件读取。删除历史记录,只需要将数据库表删除,并删除versions下的所有文件。而alembic.ini和env.py中的设置无需更改,可以再次使用。


[转载:http://windrocblog.sinaapp.com/?p=940]

你可能感兴趣的:(db)