Alembic:python中数据库迁移的瑞士军刀

Alembic 简介

Alembic 是由 SQLAlchemy 的创始人 Mike Bayer 设计的一个数据库迁移工具。它不仅支持自动迁移脚本生成,还允许开发者手动编辑迁移脚本来满足特定的需求。Alembic 通过提供一个环境来跟踪数据库模式的变更历史,确保数据库的版本与应用代码保持同步。

详见功能参见:

  1. https://alembic.sqlalchemy.org/en/latest/tutorial.html
  2. https://pypi.org/search/?q=alembic

独特的功能和特

Alembic 作为一个数据库迁移工具,在某些方面具有独特的功能和特性,这些特性让它在数据库迁移工具领域中脱颖而出:

  1. 与 SQLAlchemy 紧密集成
    Alembic 是为 SQLAlchemy 定制的迁移工具,它可以无缝地与 SQLAlchemy ORM 一起工作。这意味着如果你的项目已经在使用 SQLAlchemy,Alembic 可以非常自然地融入你的工作流程。

  2. 自动迁移生成
    Alembic 提供了自动迁移生成功能,能够根据模型定义的变化自动创建迁移脚本。这大大减少了编写迁移脚本的工作量,并且减少了人为错误。

  3. 多重数据库支持
    Alembic 不仅限于单一数据库,它支持多数据库环境。通过配置,Alembic 可以管理多个数据库的迁移,这对于需要在多种数据库之间迁移数据的项目非常有用。

  4. 灵活的命令行工具
    Alembic 提供了一个功能丰富的命令行界面,允许开发者执行各种迁移操作,如创建迁移脚本、升级数据库、回滚迁移等。

  5. 迁移依赖管理
    Alembic 使用 down_revision 来管理迁移之间的依赖关系,这确保了迁移的顺序性和一致性。这种依赖管理机制使得迁移过程更加可靠。

  6. 版本序列化
    Alembic 使用一种部分 GUID 方案来命名迁移脚本,而不是简单的递增数字。这为迁移脚本的组织和合并提供了更大的灵活性。

  7. 可扩展的脚本模板
    Alembic 允许自定义迁移脚本模板,这意味着开发者可以控制迁移脚本的结构,包括导入的模块和 upgrade()downgrade() 函数的布局。

  8. 环境脚本自定义
    env.py 脚本是 Alembic 迁移环境的一部分,可以被自定义以适应特定的项目需求,如加载项目特定的库或配置多数据库环境。

  9. 支持复杂的迁移操作
    Alembic 不仅仅支持简单的迁移操作,它还支持更复杂的数据库迁移任务,如批量数据操作和复杂的数据转换。

  10. 可与现有工作流集成
    Alembic 可以轻松集成到现有的版本控制系统和开发工作流程中,与其他开发工具和流程协同工作。

与其他迁移工具相比,Alembic 的这些特性使其在灵活性、易用性和功能丰富性方面具有优势。然而,选择哪个迁移工具还取决于项目的具体需求、团队的熟悉度以及现有的技术栈。

如何在fastapi中使用?

def run_migrations():try:from alembic.config import Configfrom alembic import commandalembic_cfg = Config("alembic.ini")command.upgrade(alembic_cfg, "head")except Exception as e:print(f"Error: {e}")@asynccontextmanager
async def lifespan(app: FastAPI):run_migrations()yieldapp = FastAPI(docs_url="/docs", redoc_url=None, lifespan=lifespan
)

配置文件示例

alembic.ini

# A generic, single database configuration.[alembic]
# path to migration scripts
script_location = migrations# template used to generate migration file names; The default value is %%(rev)s_%%(slug)s
# Uncomment the line below if you want the files to be prepended with date and time
# file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s# sys.path path, will be prepended to sys.path if present.
# defaults to the current working directory.
prepend_sys_path = .# timezone to use when rendering the date within the migration file
# as well as the filename.
# If specified, requires the python>=3.9 or backports.zoneinfo library.
# Any required deps can installed by adding `alembic[tz]` to the pip requirements
# string value is passed to ZoneInfo()
# leave blank for localtime
# timezone =# max length of characters to apply to the
# "slug" field
# truncate_slug_length = 40# set to 'true' to run the environment during
# the 'revision' command, regardless of autogenerate
# revision_environment = false# set to 'true' to allow .pyc and .pyo files without
# a source .py file to be detected as revisions in the
# versions/ directory
# sourceless = false# version location specification; This defaults
# to migrations/versions.  When using multiple version
# directories, initial revisions must be specified with --version-path.
# The path separator used here should be the separator specified by "version_path_separator" below.
# version_locations = %(here)s/bar:%(here)s/bat:migrations/versions# version path separator; As mentioned above, this is the character used to split
# version_locations. The default within new alembic.ini files is "os", which uses os.pathsep.
# If this key is omitted entirely, it falls back to the legacy behavior of splitting on spaces and/or commas.
# Valid values for version_path_separator are:
#
# version_path_separator = :
# version_path_separator = ;
# version_path_separator = space
version_path_separator = os  # Use os.pathsep. Default configuration used for new projects.# set to 'true' to search source files recursively
# in each "version_locations" directory
# new in Alembic version 1.10
# recursive_version_locations = false# the output encoding used when revision files
# are written from script.py.mako
# output_encoding = utf-8# sqlalchemy.url = REPLACE_WITH_DATABASE_URL[post_write_hooks]
# post_write_hooks defines scripts or Python functions that are run
# on newly generated revision scripts.  See the documentation for further
# detail and examples# format using "black" - use the console_scripts runner, against the "black" entrypoint
# hooks = black
# black.type = console_scripts
# black.entrypoint = black
# black.options = -l 79 REVISION_SCRIPT_FILENAME# lint with attempts to fix using "ruff" - use the exec runner, execute a binary
# hooks = ruff
# ruff.type = exec
# ruff.executable = %(here)s/.venv/bin/ruff
# ruff.options = --fix REVISION_SCRIPT_FILENAME# Logging configuration
[loggers]
keys = root,sqlalchemy,alembic[handlers]
keys = console[formatters]
keys = generic[logger_root]
level = WARN
handlers = console
qualname =[logger_sqlalchemy]
level = WARN
handlers =
qualname = sqlalchemy.engine[logger_alembic]
level = INFO
handlers =
qualname = alembic[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic[formatter_generic]
format = %(levelname)-5.5s [%(name)s] %(message)s
datefmt = %H:%M:%S

脚本管理目录示例

具体参见:https://github.com/open-webui/open-webui/blob/main/backend/alembic.ini
在这里插入图片描述

注意:如果在logging.basicConfig(stream=sys.stdout, level=GLOBAL_LOG_LEVEL, force=True)中设置了日志格式之后,又运行了alembic.upgrade, 则python日志的输出格式是由alembic.ini中的[formatter_generic]部分中定义的format确定的,

如果要修改日志的输出格式,需要修改alembic.ini中的[formatter_generic]部分中的format, 或者先运行alembic.upgrade,再执行logging.basicConfig(stream=sys.stdout, level=GLOBAL_LOG_LEVEL, force=True)部分。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/52099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux内核 时间同步机理分析笔记

1 内核时间管理的相关组件 1.1 clocksource 和 clock_event_device 1.1.1 简介 外部时钟设备的主要作用是提供精确的计时功能和定期产生中断的功能,内部把提供精确计时的功能抽象为clocksource对象,把定期产生中断的功能抽象为clock_event_device对象…

《黑神话:悟空》全网互动量超1.8亿,百万天命人重走西游

四年磨一剑,一剑破长空。 8月20日10点,《黑神话:悟空》正式开服,同时轰动了国内外游戏圈子,冲顶国内各大社媒平台,一天包揽120个热搜。上线之后,《黑神话:悟空》火速登顶Steam热销游…

克服编程学习中的挫折感:从心态到策略的全方位指南

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《热点时事》 期待您的关注 目录 引言 一、心态调整:积极乐观,合理期望 二、学习方法:有效策…

一起学Java(3)-Java项目构建工具Gradle和Maven场景定位和优缺点对比

在第一步创建的项目(java-all-in-one)项目里,我们提到了使用Gradle作为项目构建工具。看到这里,不知道你是否有疑惑,什么是项目构建工具。Java项目常用构建工具有哪些?都有什么特点? 带着疑惑&…

【教程】Ubuntu给pycharm添加侧边栏快捷方式

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 以下教程不仅限于pycharm,其他软件也是一样操作 1、进入到pycharm的目录,先通过命令行打开pycharm: ./bin/pycharm…

[Leetcode 61][Medium]-旋转链表

目录 一、题目描述 二、整体思路 三、代码 一、题目描述 原题链接 二、整体思路 首先发现这样的规律:当k大于等于链表中节点总数n时,会发现此时旋转后的链表和kk%n时的旋转后的链表一样。同时对于特殊情况n0和n1时,无论k的值为多少都可以…

论文翻译:Universal and Transferable Adversarial Attacks on Aligned Language Models

Universal and Transferable Adversarial Attacks on Aligned Language Models https://arxiv.org/pdf/2307.15043v2 通用且可转移的对抗性攻击对齐语言模型 文章目录 通用且可转移的对抗性攻击对齐语言模型摘要1 引言2 一个针对LLMs的通用攻击2.1 产生肯定回应2.2 贪婪坐标梯…

Prometheus Alertmanager告警之邮件、钉钉群、企业微信群机器人报警

文章目录 一、部署alertmanager相关组件1.alertmanager-config2.alertmanager-message-tmpl3.alertmanager 二、调试邮件告警三、钉钉群/企业微信群 报警3.1添加钉钉群机器人3.2添加企业微信群机器人3.3部署alertmanager-webhook-adaptermessage-tmplalertmanager-webhook-adap…

【PHP入门教程】PHPStudy环境搭建+HelloWorld运行

文章目录 PHP 的历史PHP 的用途PHP 的特点和优势PHP 环境搭建环境准备安装window 安装CentOS / Ubuntu / Debian 安装 第一个Hello World使用Apache服务运行命令行运行代码 PHP 的历史 PHP(Hypertext Preprocessor)超文本预处理器是一种开源的通用脚本语…

CART决策树-基尼指数(全网最详解)

文章目录 一、基尼指数的定义二、基尼指数在CART决策树中的应用三、基尼指数与CART决策树的构建1.计算每个子集的基尼系数:2.计算基尼指数3.选择最优特征4.其余基尼指数5.构建决策树 四、总结 CART决策树基尼指数是CART(Classification And Regression T…

[C语言]-基础知识点梳理-文件管理

前言 各位师傅们好,我是qmx_07,今天给大家讲解文件管理的相关知识,也就是常见的 读取,删除一类的操作 文件 为什么要使用文件? 程序的数据是存储在电脑的内存中,如果程序退出,内存回收&…

Godot自定义快捷键(配置视图快捷键)

如图 这个没啥技术,但是配置快捷键的时候有讲究如图 选择万国码并且将前后左右下上(顶底)分别配置为123456。汝等自管记好,今后自有妙用(哈哈)效果如图

解决电脑突然断网没网,以太网无网络访问权限,本地连接时出错:地址仍未与网络终结点关联

帮同事处理网络问题,尝试了拔插网线,重启电脑,禁用启用以太网,都没有解决。 于是在**命令提示符(cmd)**中执行命令: ipconfig /release 按回车执行后,返回提示:本地连接时出错:地址…

什么是GD32 MCU读保护?

如今电子产品市场风云变幻,暗流汹涌,有没有小伙伴遇到自己费了大力气写出来的代码,很容易就被别人“借鉴”了,真的是让闻者伤心,听着落泪啊。 那有没有什么方法可以防止别人将你的代码从MCU读出来呢?答案当…

大众点评2024年6月全国全分类店铺基础信息数据库

大众点评的采集在2023年之前还是比较好采集的,很多接口不需要登录,即使登录一个帐号也可以采集很多,所以大约2023年8月以前的大众点评店铺字段非常丰富,几乎所有常见店铺字段都能采集。 2023年8月以后,大量接口权限变…

网安新声 | 网易云音乐崩了:网络安全如何守护在线体验

网安加社区【网安新声】栏目,汇聚网络安全领域的权威专家与资深学者,紧跟当下热点安全事件、剖析前沿技术动态及政策导向,以专业视野和前瞻洞察,引领行业共同探讨并应对新挑战的策略与可行路径。 8月19日,#网易云音乐崩…

企业高性能web服务器【Nginx详解】

一.Web 服务基础介绍 1.1 互联网发展历程 1993年3月2日,中国科学院高能物理研究所租用AT&T公司的国际卫星信道建立的接入美国SLAC国家实 验室的64K专线正式开通,成为我国连入Internet的第一根专线。 1995年马云开始创业并推出了一个web网站 中国黄页…

VAuditDemo安装漏洞

目录 VAuditDemo安装漏洞 index.php header.php config.php lib.php install.php 分析结果 漏洞利用 第一步:删除install.lock文件,访问 install.php 抓包 第二步:通过审计构造payload 第三步:修改抓包请求内容&#x…

异常在代码中的两个作用

一.异常的作用: 作用一:异常是用来查询bug的关键参考信息。 作用二:异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况。 二.举例: 例1: 一个JavaBean类: package com.itheima.a01MyExpection;public class Student { private String name; private int…

【极限性能,尽在掌控】ROG NUC:游戏与创作的微型巨擘

初见ROG NUC,你或许会为它的小巧体型惊讶。然而,这看似不起眼的机身内,蕴藏着游戏、创意的强大能量。 掌中风暴,性能无界 ROG NUC搭载英特尔高性能处理器,配合高速NVMe SSD固态硬盘以及可选的高端独立显卡&#xff08…