前言


随着项目业务需求的不断变更,数据库的表结构修改难以避免,此时就需要对数据库的修改加以记录和控制,便于项目的版本管理和随意的升级和降级。

Alembic就可以很好的解决这个问题。Alembic是SQLAlchemy作者开发的Python数据库版本管理工具。

安装


pip install alembic

通过pip命令安装,如果使用虚拟环境,记得激活虚拟环境后再执行pip命令

同时需要安装的还有SQLAlchemy和PyMysql

pip install sqlalchemy
pip install pymysql

初始化


在使用alembic之前,需要进行初始化操作。

alembic init <YOUR_ALEMBIC_DIR>

YOUR_ALEMBIC_DIR,可以取一个符合项目名称规范的目录名,如

alembic init alembic

此时需要注意,如果之前是在虚拟环境中安装的alembic,需要激活虚拟环境后,在执行上述命令。

同时,建议cd到项目根目录再执行初始化操作,因为YOUR_ALEMBIC_DIR会在当前目录下创建。

显示类似结果即初始化成功。

Creating directory D:\Project\py_sqlalchemy_demo\alembic ... done
Creating directory D:\Project\py_sqlalchemy_demo\alembic\versions ... done
Generating D:\Project\py_sqlalchemy_demo\alembic.ini ... done
Generating D:\Project\py_sqlalchemy_demo\alembic\env.py ... done
Generating D:\Project\py_sqlalchemy_demo\alembic\README ... done
Generating D:\Project\py_sqlalchemy_demo\alembic\script.py.mako ... done
Please edit configuration/connection/logging settings in 'D:\\Project\\py_sqlalchemy_demo\\alembic.ini' befor
e proceeding.

初始化成功后,会在执行初始化命令的目录下,生成一个alembic.ini的配置文件,及一个alembic目录,目录名就是之前设置的YOUR_ALEMBIC_DIR。

修改配置文件


接下来对alembic.ini的信息进行修改。

主要修改的是配置文件中的数据库连接部分。

sqlalchemy.url = driver://user:pass@localhost:port/dbname

将配置文件中,此部分替换成对应的数据库连接,这个数据库连接的写法是与SQLAlchemy创建engine时是一样的。

如我在demo中使用的是SQLAlchemy与PyMysql,那数据库连接就是类似如下

mysql+pymysql://demo_user:demo123456@127.0.0.1:3306/demo_db

修改env.py


除修改配置文件外,还需要对YOUR_ALEMBIC_DIR目录下的env.py文件进行修改。

在env.py中,将target_metadata设置成项目的model,使alembic能获取到项目中model定义的信息。

将原先的

target_metadata = None

修改成项目中的model

import os
import sys
# 此处需要将项目路径添加到sys.path,否则from import时找不到models
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/../")
from models.base import BaseModel
target_metadata = BaseModel.metadata

创建新版本


用 alembic revision -m+注释 创建数据库版本

alembic revision --autogenerate -m "init db"

运行后,类似如下结果,即创建版本成功

INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.autogenerate.compare] Detected removed table 'user'
Generating D:\Project\py_sqlalchemy_demo\alembic\versions\7b55b3d83158_create_tables.py ... done

每次修改过SQLAlchemy的model,执行此命令即可创建对应的版本。

执行成功后,会在项目根目录下的alembic/versions/下生成的对应版本的py文件。命令规则是版本号+注释。(这个命名规则是在配置文件中定义的)

在每次创建新版本后,需要执行将数据库升级到新版本的命令,才能继续更新版本。

变更数据库


在每次创建新版本后,需要执行将数据库升级到新版本的命令,才能继续更新版本

将数据库升级到最新版本

alembic upgrade head

运行结果类似

(venv_win) D:\Project\py_sqlalchemy_demo>alembic upgrade head
INFO [alembic.runtime.migration] Context impl MySQLImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.runtime.migration] Running upgrade 7b55b3d83158 -> b034414f04cd, create tables02

其中,命令中的head和base特指最新版本和最初版本。当需要对数据库进行升级时,使用upgrade,降级使用downgrade。

将数据库降级到最初版本

alembic downgrade base

将数据库降级到执行版本,使用alembic downgrade+版本号,不包含注释部分

alembic downgrade <version>

alembic downgrade 7b55b3d83158

运行结果

INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.runtime.migration] Running downgrade b034414f04cd -> 7b55b3d83158, create tables02

升级也是同样的道理,alembic upgrade+版本号

离线更新(生成sql脚本)


在某些不适合在线更新的情况,可以采用生成sql脚本的形式,进行离线更新:

alembic upgrade <version> --sql > migration.sql

如:

alembic upgrade ae1027a6acf --sql > migration.sql

从特定起始版本生成sql脚本:

alembic upgrade <vsersion>:<vsersion> --sql > migration.sql

如:

alembic upgrade 1975ea83b712:ae1027a6acf --sql > migration.sql

如果是数据库降级操作,把upgrade替换为downgrade。

查询当前数据库版本号


在对数据库进行升级或降级后,会在当前操作的数据库中新增一个表;alembic_version。

表中的version_num字段记录了当前的数据库版本号。

清除所有版本


如果需要清除所有的版本,将versions删除掉,同时删除数据库的alembic_version表。

参考资料

http://alembic.zzzcomputing.com/en/latest/tutorial.html

http://www.codeweblog.com/%E5%B8%B8%E8%A7%81%E7%9A%84sqlalchemy%E5%88%97%E7%B1%BB%E5%9E%8B-%E9%85%8D%E7%BD%AE%E9%80%89%E9%A1%B9%E5%92%8C%E5%85%B3%E7%B3%BB%E9%80%89%E9%A1%B9/

http://blog.csdn.net/wenxuansoft/article/details/50242957

使用alembic进行数据库版本管理的更多相关文章

  1. [jOOQ中文]3. 数据库版本管理工具Flyway

    https://segmentfault.com/a/1190000010526452 在执行数据库迁移时,我们推荐使用jOOQ与Flyway - 数据库迁移轻松. 在本章中,我们将简单的来使用这两个 ...

  2. 【flyway】开源的数据库版本管理工具【migration】

    开源的数据库版本管理工具[migration] 记录

  3. 在SpringBoot中使用flyway进行数据库版本管理

    本文大纲 flyway是什么 能帮助我们解决什么问题 springboot环境下使用flyway flyway的工作原理 一.flyway是什么 Flyway是一个开源的数据库版本管理工具,并且极力主 ...

  4. flask开发restful api系列(3)--利用alembic进行数据库更改

    上面两章,主要讲基本的配置,今天我们来做一个比较有趣的东西,为每个客户加一个头像图片.如果我们图片保存在自己的服务器,对于服务器要求有点高,每次下载的时候,都会阻塞网络接口,要是1000个人同时访问这 ...

  5. 数据库版本管理工具Flyway——基础篇

    Flyway 默认规约 SQL 脚本文件默认位置是项目的源文件夹下的db/migration 目录. Java 代码默认位于db.migration 包. SQL 脚本文件及Java 代码类名必须遵循 ...

  6. 使用Source Safe for SQL Server解决数据库版本管理问题

    简介     在软件开发过程中,版本控制是一个广为人知的概念.因为一个项目可能会需要不同角色人员的参与,通过使用版本控制软件,可以使得项目中不同角色的人并行参与到项目当中.源代码控制使得代码可以存在多 ...

  7. 使用Source Safe for SQL Server解决数据库版本管理问题(转载)

    简介 在软件开发过程中,版本控制是一个广为人知的概念.因为一个项目可能会需要不同角色人员的参与,通过使用版本控制软件,可以使得项目中不同角色的人并行参与到项目当中.源代码控制使得代码可以存在多个版本, ...

  8. 数据库版本管理工具Flyway(4.0.3)---工作机制(译文)

    How Flyway works The easiest scenario is when you point Flyway to an empty database. 最容易的方案是Flyway指向 ...

  9. 数据库版本管理工具Flyway(4.0.3)---介绍(译文)

    Flyway Evolve your Database Schema easily and reliably across all your instances 简单的.可靠的升级(发展)你的数据库模 ...

随机推荐

  1. ibv_open_device()函数

    struct ibv_context *ibv_open_device(struct ibv_device *device); 描述 函数会创建一个RDMA设备相关的context:可以通过ibv_c ...

  2. 浅析文本挖掘(jieba模块的应用)

    一,文本挖掘 1.1,什么是文本挖掘 文本挖掘是指从大量文本数据中抽取事先未知的,可理解的,最终可用的知识的过程,同时运用这些知识更好的组织信息以便将来参考 1.2,文本挖掘基本流程 收集数据 数据集 ...

  3. javascript设计模式——发布订阅模式

    前面的话 发布—订阅模式又叫观察者模式,它定义对象间的一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知.在javascript开发中,一般用事件模型来替代传统的发布—订阅模 ...

  4. 200行Java代码搞定计算器程序

    发现了大学时候写的计算器小程序,还有个图形界面,能够图形化展示表达式语法树,哈哈;) 只有200行Java代码,不但能够计算加减乘除,还能够匹配小括号~ 代码点评: 从朴素的界面配色到简单易懂错误提示 ...

  5. 双向bfs-八数码问题

    [八数码][1] [1]: https://www.luogu.org/problem/show?pid=1379 其实除了搜索恶心一点,好像也没什么提高+的 bfs搜的是状态. 双向bfs同时从起点 ...

  6. google protocol buffer的原理和使用(四)

    有个电子商务的系统(如果用C++实现).当中的模块A须要发送大量的订单信息给模块B.通讯的方式使用socket. 如果订单包含例如以下属性: ----------------------------- ...

  7. hdu4932 Miaomiao&#39;s Geometry (BestCoder Round #4 枚举)

    题目链接:pid=4932" style="color:rgb(202,0,0); text-decoration:none">http://acm.hdu.edu ...

  8. 怎样在Ubuntu Scope中定义设置变量并读取

    在本遍文章中,我们来解说怎么对我们的Ubuntu Scope进行设置.对Scope而言,有些时候我们希望可以使用设置来改变我们的显示.或对我们的搜索进行又一次定义.关于很多其它Scope的开发,请參阅 ...

  9. Python笔记·第五章—— 列表(List) 的增删改查及其他方法

    一.列表的简介   列表是python中的基础数据类型之一,其他语言中也有类似于列表的数据类型,比如js中叫数组,他是以[ ]括起来,每个元素以逗号隔开,而且他里面可以存放各种数据类型比如:li = ...

  10. ABP入门系列(6)——定义导航菜单

    ABP入门系列目录--学习Abp框架之实操演练 完成了增删改查以及页面展示,这一节我们来为任务清单添加[导航菜单]. 在以往的项目中,大家可能会手动在layout页面中添加一个a标签来新增导航菜单,这 ...