使用alembic为SQLAlchemy迁移数据

用惯了django的迁移命令后, 发现SQLAlchemy默认没有对应的迁移命令, 但是SQLAlchemy作者为SQLAlchemy开发了迁移工具: Alembic, 其官方文档见: Alembic Tutorial

使用这个工具的需要前提安装数据库链接库,如: pymysql

我这里使用 virtualenv创建虚拟环境, 所以使用 pip命令安装:

$pip install alembic

在项目的根目录执行初始化命令:

$alembic init alembic

上述命令的第二个 alembic指的是存放配置和迁移历史等数据的目录, 设置自己喜欢的目录名

此时 alembic会生成以下目录与文件:


+--- alembic
|   +--- env.py
|   +--- README
|   +--- script.py.mako
|   +--- versions
|
+--- alembic.ini

接下来需要配置 alembic.inienv.py:

执行: alembic upgrade head命令,
该命令指的是: 将数据库升级(切换)到最新版本, 该过程会创建没有表
你可以类比 git

假如不是第一次执行迁移命令了, 你可以执行以下命令:
alembic revision --autogenerate -m "init db"

-m指定此次迁移的注释, alembic会根据这个注释在 versions目录生成一个 py文件, 用于记录操作

查看迁移历史

$alembic history --verbose
Rev: fe3dcb76f464 (head)
Parent: 8bb0bf479f9d
Path: E:\code\Project\alembic\versions\fe3dcb76f464_测试.py
    Create Date: 2022-02-19 21:59:22.473262

Rev: 8bb0bf479f9d
Parent:
Path: E:\code\Project\alembic\versions\8bb0bf479f9d_init_db.py

    init db

    Revision ID: 8bb0bf479f9d
    Revises:
    Create Date: 2022-02-19 21:22:46.521491

我们主要需要关注 head即头指针的位置和 Revision ID即该迁移的哈希值, 对应着该版本的指针

查看当前指针的指向

$alembic current
2022-02-19 22:12:39,749 INFO sqlalchemy.engine.Engine BEGIN (implicit)
...

2022-02-19 22:12:39,755 INFO sqlalchemy.engine.Engine COMMIT
INFO  [alembic.runtime.migration] Context impl SQLiteImpl.

INFO  [alembic.runtime.migration] Will assume non-transactional DDL.

8bb0bf479f9d

最后一行的值为当前版本的指向

切换到对应的迁移版本

这里对应向上和向下切换
通过 Parent确定此次迁移的父版本

向上切换
alembic upgrade

向下切换
alembic downgrade
$alembic downgrade 8bb0bf479f9d
$alembic upgrade fe3dcb76f464

当然也可以使用命令直接切换到最新/老的版本:

切换到最新版本
$alembic upgrade head

切换到最老版本
$alembic downgrade base

生成sql文件

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

alembic upgrade  --sql > migration.sql
$alembic upgrade 8bb0bf479f9d--sql > migration.sql

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

alembic upgrade : --sql > migration.sql
$alembic upgrade 8bb0bf479f9d:fe3dcb76f464--sql > migration.sql

Original: https://www.cnblogs.com/lczmx/p/15913991.html
Author: 403·Forbidden
Title: 使用alembic为SQLAlchemy迁移数据

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/581317/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • docker官方仓库下载镜像

    官方仓库镜像地址:https://hub.docker.com/search/ 以下载mysql为例 进入到详情页后我们看到有很多Tags 我们选择5.7.25版本进行下载 doc…

    Java 2023年6月8日
    090
  • 缓存雪崩问题,缓存穿透问题及解决思路

    1.缓存雪崩 缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。 解决方案: 给不同的Key的TTL添加随机值 利用Red…

    Java 2023年6月9日
    069
  • HBase为什么查询快

    HBase为什么可以实现毫秒级查询? 大数据量的快速查询 HBase的region经过负载均衡,region相对均匀,每次只需要通过zk找到meta表,进而连接到所需的region…

    Java 2023年6月8日
    094
  • gulp: Did you forget to signal async completion? 解决方案

    学习gulp的前端自动化构建,按照示例代码,跑了一个简单的task,控制台打出如下提示: The following tasks did not complete: testGul…

    Java 2023年6月15日
    065
  • 编码中的Adapter,不仅是一种设计模式,更是一种架构理念与解决方案

    大家好,又见面了。 不知道下面这玩意大家有没有见过或者使用过?这是一个 插座转换器。我们都知道日常使用的是 220v的交流电,而国外不同国家使用的电流电压是不一样的(比如日本使用的…

    Java 2023年6月7日
    089
  • MyBatis-Plus 笔记

    MyBatis-Plus学习(3.3.1.tmp版本教程) 1、快速开始 1.1、数据库脚本 DROP TABLE IF EXISTS user; CREATE TABLE use…

    Java 2023年6月7日
    086
  • Java压缩音频视频工具类

    /** * TODO * * @author Administrator * @version 1.0 * @date 2021/11/5 16:55 */ public clas…

    Java 2023年6月15日
    080
  • java list 坑一 sublist

    Java List sublist 在java开发中,经常会有对列表的迭代循环遍历需求,其中出了查找、排重、统计意外就是截取需求,比如配置文件读取后找到相应的部分内容行等等 &am…

    Java 2023年6月5日
    073
  • 9.Hystrix快速失败、降级及熔断机制

    降级介绍 降级是一种”无奈”的选择,就是俗称的备胎 Command降级需要fallback方法 ObservableCommand降级实现resumeWit…

    Java 2023年6月8日
    089
  • .Net Core3.1上用EFCore的反向工程生成

    反向工程-EF Core | Microsoft Docs 原文:https://www.cnblogs.com/qidakang/p/11302327.html 一、简要步骤 1…

    Java 2023年5月29日
    071
  • Day13 note

    super注意点: 1、super调用父类的构造方法,必须在构造方法的第一行 2、super必须只能出现在子类的方法或者构造方法中 3、super和this不能同时调用构造方法对比…

    Java 2023年6月5日
    082
  • 2018年最新JAVA面试题总结之数据库(3)

    转自于:https://zhuanlan.zhihu.com/p/39804394 1、MySQL的delete与truncate区别? 回答:delete语句执行删除的过程是每次…

    Java 2023年6月13日
    077
  • 数据迁移的套路

    数据迁移的类型 随着业务的发展,存储也会经常性的需要迁移。以下场景是我们开发过程中经常遇到的 业务、团队在快速扩张,需要适当时机进行微服务的拆分,需要独立的数据库,将数据从源数据库…

    Java 2023年6月8日
    085
  • 从零开始实现放置游戏(十四)——实现战斗挂机(5)地图移动和聊天

    上一节添加了websocket组件,实现了前后端通信。后面我们只需要根据游戏的业务逻辑,逐步实现各种功能即可。 另外,在实现具体业务逻辑时,发现上一章设计的消息对象有些不合理,由于…

    Java 2023年6月5日
    0101
  • beanshell Sampler引入jar测试成功,JSR223 Sampler 失败记录

    同样的jar包使用beanshell Sampler可以测试,使用JSR223 Sampler报错 Java方法导出jar包,使用测试计划添加,或放入lib包,或ext包下 pub…

    Java 2023年6月8日
    078
  • 替代 Hystrix,Spring Cloud Alibaba Sentinel 快速入门

    提起 Spring Cloud 的限流降级组件,一般首先想到的是 Netflix 的 Hystrix。 不过就在2018年底,Netflix 宣布不再积极开发 Hystrix,该项…

    Java 2023年5月30日
    0104
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球