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

news2024/10/2 8:22:48

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 Config
        from alembic import command

        alembic_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()
    yield


app = 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.coloradmin.cn/o/2065593.html

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

相关文章

推荐一个完全自由的目录设计网站

引言 如果我们能通过网站出一本书,这将是一件很酷的事。 事实上,我们通过网站发布知识,最常见的是写博客。 这二者有什么区别呢? 书本的知识内容有很强的逻辑性、系统性。而博客是随心所欲的,一时灵感来了就写一篇…

关闭Chrome快捷键

chrome是没办法改变快捷键以及屏蔽快捷键的,需要安装插件:shortkey 保证插件是开启的 不用做其他设置所有快捷键已被关闭

OAPT:用于双JPEG伪影去除的偏移感知分区的Transformer

OAPT: Offset-Aware Partition Transformer for Double JPEG Artifacts Removal https://github.com/QMoQ/OAPT 2408.11480 (arxiv.org) 基于深度学习的方法在去除单个JPEG伪影任务中表现出了显著的性能。然而,现有方法在处理双重JPEG图像时往往会退化&#xff0c…

127-隧道搭建穿透上线FRPNPSNgrok

使用了几种工具将会一一介绍 ngrokru 项目地址:Sunny-Ngrok内网转发内网穿透 - 国内内网映射服务器 这个网站现在要实名认证(还得花2元解锁) 用这种在线的网站怎么说呢,真不如自己买个云服务器用下面的frp,毕竟流量…

Python3:多行文本内容转换为标准的cURL请求参数值

背景 在最近的工作中,经常需要处理一些接口请求的参数,参数来源形式很多,可能是Excel、知识库文档等,有些数据形式比较复杂,比如多行或者包含很多不同的字符,示例如下: **客服质检分析指引** …

多个程序监听不同网卡的相同端口、相同网卡不同IP的相同端口

1 概述 一个主机上的多个程序监听同一个端口,是否一定存在冲突?如果是多网卡、单网卡多IP的情景下,多个程序是可以独立监听的。 2 多个程序监听不同网卡的相同端口 3 多个程序监听同一个网卡不同IP的相同端口 4 小结 多个程序监听同一个网…

生成式人工智能会导致人工智能崩溃吗

况可能很快就会发生变化。 从定义上讲,LLM 需要大量数据,而且所使用的数据集越来越大。根据缩放定律[2],要提高性能,必须同时增加参数数量和训练标记数量(后者被认为是最重要的因素)。 这些数据集包含人类产…

0x03 ShowDoc 文件上传漏洞(CNVD-2020-26585)复现

参考:ShowDoc文件上传漏洞(CNVD-2020-26585)_showdoc漏洞-CSDN博客 一、fofa 搜索使用该工具的网站 网络空间测绘,网络空间安全搜索引擎,网络空间搜索引擎,安全态势感知 - FOFA网络空间测绘系统 "S…

ZMQ请求应答模型

案例一 这个案例的出处是ZMQ的官网。请求段发送Hello&#xff0c;应答端回复World。 ZMQ Request(client) #include <string> #include <iostream> #include <zmq.hpp>using namespace std; using namespace zmq; // 使用 zmq 命名空间int main() {// ini…

知识竞赛答题设备及答题方式有哪些

根据我们多年的知识竞赛承办经验&#xff0c;我来谈谈在知识竞赛中常用的答题设备和答题方式。 一、常用答题设备 1.电脑 如果电脑资源充足&#xff0c;可以用笔记本电脑进行答题&#xff0c;笔记本电脑可以采取有线或无线方式进行连网&#xff0c;可以根据情况选择连网方案&…

PyTorch专栏介绍

专栏导读 深度学习作为人工智能领域的重要分支&#xff0c;其应用范围广泛&#xff0c;从图像识别到自然语言处理&#xff0c;再到强化学习等。PyTorch作为当前流行的深度学习框架之一&#xff0c;以其动态计算图和易用性受到了广大开发者的青睐。本专栏将带领读者从零开始&am…

kubeadm搭建生产环境高可用集群

前言 搞了好多天&#xff08;今天是20240819&#xff09;&#xff0c;中途遇到各种各样的问题&#xff0c;总算是可以用了 我这里用的vmware开了5台服务器做学习实践 K8S因为直接使用的 pkgs.k8s.io 仓库&#xff0c;所以直接拉取的最新release版&#xff08;v1.31&#xff09…

结构开发笔记(五):solidworks软件(四):绘制36x36方块摄像头基座

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/141422131 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

【hot100篇-python刷题记录】【盛最多水的容器】

R6-双指针篇 印象题 双指针法&#xff0c;num1在0处&#xff0c;num2在n-1处&#xff0c;相对移动收缩。 核心&#xff1a; 每次单步移动短板&#xff0c;因为长板收缩面积肯定变小。 面积&#xff1a;短板决定 class Solution:def maxArea(self, height: List[int]) ->…

【嵌入式软件】stm32内部flash读写

1.简介 控制系统采用STM32F429IGT6,STM32F429IGT6 的 FALSH 容量为 1024K 字节。 STM32F429 的闪存模块组织如下表所示。 STM32F429xx 的闪存模块由:主存储器、系统存储器、OTP 区域和选项字节等 4 部分组 成。 1)主存储器,该部分用来存放代码和数据常数(如 con…

PHP开发过程中常见问题快速解决

1.PHP解决文件名不合法,无法创建 文件名称不能含有 /\:*?"<>|符号&#xff0c;直接替换关键词就OK了 $search array(*,$,\\,/,"",",*,?,:,<,>,|, ,[,],【,】,(,),&#xff08;,&#xff09;); $name"1:.php"; $new_namestr_repla…

Windows 11新版将至:Zen5、Zen4、Zen3游戏性能一起飞

锐龙9000系列发布之初&#xff0c;有些媒体和玩家发现&#xff0c;其游戏性能没有官方宣传的提升那么高&#xff0c;于是产生了一些质疑&#xff0c;AMD今天特意就此撰文&#xff0c;给出了详细的解释&#xff0c;并透露未来会随着Windows 11的升级而释放更多性能潜力。 事实上…

FreeRTOS学习:内存管理

FreeRTOS内存管理简介 在使用 FreeRTOS 创建任务、队列、信号量等对象的时候&#xff0c; FreeRTOS 一般都提供了两种方法&#xff0c; 动态方法创建&#xff1a;自动地从 FreeRTOS 管理的内存堆中申请所创建对象所需的内存&#xff0c;在对象被删除后&#xff0c;又可以将这…

基于Django的停车场车辆出入管理系统,可识别车牌图片

研究背景 随着城市化进程的加快&#xff0c;车辆数量不断增加&#xff0c;停车场的管理成为一个日益重要的课题。传统的停车场管理系统依赖人工登记和监控&#xff0c;不仅效率低下&#xff0c;而且容易出现疏漏和错误&#xff0c;难以满足现代社会对停车场管理智能化、高效化…

Scrum敏捷开发高效实践课程:面向企业团队的系统化训练,旨在提升研发效率,优化项目管理,推动企业敏捷化发展。

课程简介&#xff1a; Scrum 是一种广泛应用的敏捷开发方法&#xff0c;用于项目管理和产品研发。该课程为期两天&#xff0c;专为研发管理者、项目经理、产品经理和研发团队设计。通过案例讲解和沙盘演练&#xff0c;学员将深入理解Scrum的核心理念&#xff0c;如产品价值驱动…