使用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)

大家都在看

  • 基于Python豆瓣自动化测试【1】

    —— Pytest基础使用教程【1】 引言 Pytest 是一个非常实用的自动化测试框架,目前来说资料也是非常多了。最近某友人在学习 Python的一些测试技术,帮其网上搜了下教程…

    Java 2023年6月15日
    066
  • Java Web Servlet 继承结构和生命周期

    Java Web Servlet 继承结构和生命周期 继承结构 继承关系如下图所示 抽象类Servlet有以下接口,其中init(),service(),destroy()三个主要…

    Java 2023年6月8日
    089
  • vue-i18n 初体验

    vue-i18n 初体验 使用vue,如何国际化呢?采用 vue-i18n。(i18n,internationalization,i和n中间省略18个字符) vue-i18n 官网…

    Java 2023年6月5日
    085
  • 如何在servlet取得spring beans (autowired)(转)

    在应用中一般普通的JavaPojo都是由Spring来管理的,所以使用autowire注解来进行注入不会产生问题,但是有两个东西是例外的,一个是 Filter,一个是Servlet…

    Java 2023年5月30日
    077
  • 三分钟入门

    网络编程(通俗易懂) tcp通信:打电话,对方接,接了,通话,互通性 udp通信:发短信,发完就完事 通信作用:无非就是传播交流信息,进行数据交换 实现网络通信: IP 端口 规则…

    Java 2023年6月6日
    078
  • 利用快慢指针寻找链表中点

    快慢指针的原理类似于时钟里的分针时针,在链表中,二者同时从head首节点出发,快指针一次走两步,慢指针一次走一步,当快指针走到终点时,慢指针所在位置即为链表的中点。 代码: cla…

    Java 2023年6月13日
    082
  • EasyExcel配置步骤

    1.介绍 EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目参考https://blog.csdn.net/u013044713/article/deta…

    Java 2023年6月9日
    082
  • nginx 伪静态跳转

    301跳转要带着 permanent; 302 不带permanent rewrite ^.*$ https://www.hahaha.com/$1 permanent; Orig…

    Java 2023年5月30日
    081
  • Springboot 整合 MyBatisPlus[详细过程]

    Springboot 整合 MyBatisPlus[详细过程] 提要 这里已经将Springboot环境创建好 这里只是整合MyBatis过程 引入Maven依赖 添加MyBati…

    Java 2023年6月9日
    083
  • java常见面试题及答案

    1.什么是Java虚拟机?为什么Java被称作是”平台无关的编程语言”? Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。Java 源文件被编…

    Java 2023年5月29日
    066
  • Mac M1 安装 Nacos 操作及问题解决

    先安装mysql ,这里使用的是8+版本,原因在于原本的 5.7 版本中并没有对 m1 的良好支持,如果启动会有报错说查询不到对应版本信息(虽然可以通过自定义 mirror 实现)…

    Java 2023年6月15日
    0112
  • Java(14)对象构造

    之前学习了编写简单的构造器,可以定义对象的初始状态。但是,由于对象构造非常重要,所以Java提供了多种编写构造器的机制。 有些类有多个构造器。例如,可以如下构造一个空的 Strin…

    Java 2023年6月9日
    088
  • Java中循环体 标记的用法

    break 的作用 循环结构中使用break,直接结束当前循环体,跳出当前循环。 用于switch或者是循环语句中。 单用break 只跳出当前循环,如果使用标记,可以跳出其他外层…

    Java 2023年6月8日
    077
  • Java的虚拟线程(协程)特性开启预览阶段,多线程开发的难度将大大降低

    高并发、多线程一直是 Java编程中的难点,也是面试题中的要点。 Java开发者也一直在尝试使用多线程来解决应用服务器的并发问题。但是多线程并不容易,为此一个新的技术出现了,这就是…

    Java 2023年5月29日
    080
  • Java内部DNS查询实现和参数设置

    一、Java内部DNS查询 Java使用域名查询时,用的自己内部的域名实现机制,最后都是交给InetAddress去做DNS解析。 二、JNDI DNS服务提供者设置(JNDI D…

    Java 2023年5月29日
    075
  • idea项目运行时报错提示Could not locate executable nullbinwinutils.exe in the Hadoop binaries

    出现这个错误,从网上下载一个名为 winutils.exe 的小插件放到 hadoop/bin目录后,在window中配置hadoop环境,然后重启idea 否则还是会报错 下载地…

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