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. 创建订单 请求创建订单的 API 接口:把 订单金额、收货地址、订单中包含的商品信息 发送到服务器服务器响应的结果:订单编号 2.订单预支付 请求订单预支付的 API 接口:把步骤1得到的 订单编号 发送到服务器服务器响应的结果:…

P9145 [THUPC 2023 初赛] 世界杯

[题目通道]([THUPC 2023 初赛] 世界杯 - 洛谷) 简要题意:输出五常中的最强球队。 众所周知,每个国家的球队都有自己的长处,在不同规则下最强球队也有所不同。而小 M 制定的规则是输球场数最少,这是有道理的,因为输球…

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

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

网络通信编程UDP/TCP

一、不同体系结构间的互联互通 通信本质:不同主机上进程间的通信。通过 IP 标识网络中的一台主机,本质上是 32 位的整型数据;通过端口号标识某个进程,本质上是 16 位的整型数据。网络模型:主要有 C/S(客户…

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

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

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

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

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

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

ETL开发团队应对突发技术故障和危机的策略

建立有效的监控和警报系统 首先,建立有效的监控和警报系统是应对突发技术故障和危机的重要步骤。通过监控ETL流程和相关系统的关键指标,例如数据传输速度、资源利用率和错误日志,您可以提前发现潜在的问题。设置警报机制,及时通知…

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

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

C程序设计——常量后缀

本节内容,如果感觉学的比较吃力,可以最后再翻回来看。 上一节,我们讲了两种常量,在这里我个人给他们起名字,分别叫做数值常量、名称常量。 下面这些是数值常量: // 下面是数值常量 987; 0123; 0xba9; 6.…

关于HTTP HEAD介绍

一、HTTP HEAD介绍 HTTP HEAD 是一种 HTTP 请求方法,它用于请求服务器返回指定资源的元信息(metadata),而不包括响应体的内容。这种请求方式常用于客户端预先评估资源的大小、最后修改日期或其他头信息,而无需实际下载…

论文翻译: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…

Vue组件命名报错 Component name “index“ should always be multi-word

原因 在Vue创建组件时我们往往会使用 index.vue 之类来命名,但是此时组件会报错【Component name "index" should always be multi-word】,组件名应该总是为多个单词组成。这是因为官方文档建议组件名写成驼峰式或者-衔接的形式&#…

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

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

哈希环算法(C语言版本)

文章目录 理论分析:经典案例案例一:开放寻址法案例二:经典哈希环算法案例总结 理论分析: 所谓的哈希环就是就是数据结构里面的数组,只不过我们通过设置使其首尾相连,而这个数组又非常的大,这些…

设计模式实战总结与Java程序员学习路线图

经过一系列的设计模式实战练习,从在线购物系统到旅行预订系统,本专栏已涵盖了多种常用设计模式的应用与实现。本文将对整个专栏进行总结,并为Java程序员提供一份学习路线图,帮助更好地规划未来的学习与职业发展方向。 一、设计模式学习总结 本专栏分为26篇文章,内容涵盖…

网络硬件升级指南:提升性能的策略与实践

随着企业对网络依赖程度的增加,网络性能的提升已成为信息技术部门的首要任务。本文将探讨如何通过升级网络硬件来提高网络性能,包括选择正确的硬件、实施升级策略和考虑未来网络的可扩展性。 一、网络性能的重要性 在数字化时代,网络是企业…

[BaseCTF 2024] 高校联合新生赛 Crypto (week1-7)

半个月没有落笔了。又到开学季,老油条们又在教新生了。题目很多,本想过于简单就不提交了,可以总是想起去年,到最后总是忘掉哪个作了哪个没作,也挺乱的。这回一共有7周呢,而且有的比赛题目居然不按周排序。 …