• 使用alembic进行数据库版本管理


    前言


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

    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:Projectpy_sqlalchemy_demoalembic ... done
    Creating directory D:Projectpy_sqlalchemy_demoalembicversions ... done
    Generating D:Projectpy_sqlalchemy_demoalembic.ini ... done
    Generating D:Projectpy_sqlalchemy_demoalembicenv.py ... done
    Generating D:Projectpy_sqlalchemy_demoalembicREADME ... done
    Generating D:Projectpy_sqlalchemy_demoalembicscript.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:Projectpy_sqlalchemy_demoalembicversions7b55b3d83158_create_tables.py ... done

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

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

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

    变更数据库


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

    将数据库升级到最新版本

    alembic upgrade head

    运行结果类似

    (venv_win) D:Projectpy_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

     

  • 相关阅读:
    上网行为管理网络部署方式
    CentOS系统安装中文man手册
    打印机:连接失败,检查设定并检查扫描的文件状态
    hosts文件导致打不开某些网站
    NTP服务搭建
    VMware中三种网络连接的区别
    vm虚拟机里的桥接模式下“复制物理网络连接状态”作用
    IP配置
    OC方法和文件编译
    OC语言基础知识
  • 原文地址:https://www.cnblogs.com/blackmatrix/p/6236573.html
Copyright © 2020-2023  润新知