Alembic 实战指南:快速入门到FastAPI 集成

一、快速开始

1.1 简介

Alembic 是一个基于 SQLAlchemy 的数据库迁移工具,主要用于管理数据库模式(Schema)的变更,例如新增表、修改字段、删除索引等,确保数据库结构与应用程序的 ORM 模型保持一致。

Alembic 通过版本控制来管理数据库模式的变化,每次迁移都会生成一个唯一的版本文件,类似于 Git 的提交(commit)。

  • 在线模式:直接连接数据库,执行迁移。
  • 离线模式:生成 SQL 语句,后续再执行。

1.2 安装

uv add alembic

1.3 初始化

uv run alembic init alembic# 最后的alembic是项目的名字,可以修改,类似虚拟环境

1.4 alembic 目录结构

project/
│── alembic/             # Alembic 迁移目录
│   ├── versions/        # 迁移脚本存放目录
│   ├── env.py           # 迁移脚本配置(数据库连接、ORM 绑定等)
│   ├── script.py.mako   # 迁移脚本的模板
│── alembic.ini          # Alembic 配置文件

二、实战

2.1 实战简介

使用 FastAPI + SQLModel + PostgreSQL + Alembic 测试 Alembic 数据库迁移功能

2.2 项目初始化

  • 创建测试文件夹
mkdir test-alembic
  • 设置 uv 工程
cd test-alembic && uv init

如果你不知道 uv 是什么?推荐你看看博主的这篇文章哟~

Python 项目管理利器:uv 入门指南

  • 增加项目依赖项
uv add fastapi sqlmodel psycopg2 alembic pydantic_core pydantic_settings
  • 初始化 FastAPI 项目
from fastapi import FastAPIapp = FastAPI()
  • 创建项目 settings.py 模块
from pydantic import ConfigDict, computed_field, PostgresDsn
from pydantic_core import MultiHostUrl
from pydantic_settings import BaseSettingsclass Settings(BaseSettings):POSTGRES_SERVER: strPOSTGRES_PORT: int = 5432POSTGRES_USER: strPOSTGRES_PASSWORD: str = ""POSTGRES_DB: str = ""model_config = ConfigDict(env_file=".env")  # 使用 model_config 替代 class ConfigDict@computed_field  # type: ignore[prop-decorator]@propertydef SQLALCHEMY_DATABASE_URI(self) -> PostgresDsn:return MultiHostUrl.build(scheme="postgresql+psycopg2",username=self.POSTGRES_USER,password=self.POSTGRES_PASSWORD,host=self.POSTGRES_SERVER,port=self.POSTGRES_PORT,path=self.POSTGRES_DB,)settings = Settings()  # type: ignore

2.3 创建 models.py 模块

import uuid
from datetime import datetimefrom sqlmodel import Field, SQLModelclass User(SQLModel, table=True):id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)user_account: str = Field(..., max_length=32, description="账号")username: str = Field(default="", max_length=32, description="用户昵称", nullable=True)user_avatar: str = Field(default="", max_length=64, description="用户头像", nullable=True)user_profile: str = Field(default="", max_length=512, description="用户简介", nullable=True)user_role: str = Field(default="user", max_length=32, description="用户角色:user/admin/ban")create_time: datetime = Field(default_factory=datetime.now, description="创建时间")update_time: datetime = Field(default_factory=datetime.now,sa_column_kwargs={"onupdate": datetime.now},description="更新时间",)is_delete: bool = Field(default=False, description="是否删除", nullable=True)

2.4 初始化 Alembic

uv run alembic init alembic

2.5 连接 PG 数据库

  • 创建 .env 文件
POSTGRES_SERVER=localhost
POSTGRES_PORT=5432
POSTGRES_USER=admin
POSTGRES_PASSWORD=123456
POSTGRES_DB=test

假设你的 PG 数据库设置是上面这些

  • 修改 env.py 文件 如下
from logging.config import fileConfigfrom alembic import context
from sqlalchemy import engine_from_config, pool# 这是 Alembic 配置(Config)对象,它提供对当前使用的 .ini 配置文件中参数的访问
config = context.config# 解释 Python 日志配置文件
# 这行代码的作用基本上是设置日志记录器 loggers
fileConfig(config.config_file_name)# 在此添加你的模型的 MetaData 对象 以支持 自动生成(autogenerate) 迁移脚本
# User 必须存在,虽然看起来没有使用到,但是这样才会被SQLModel识别到!!!
from models import SQLModel, User
from settings import settingstarget_metadata = SQLModel.metadata# env.py 需要的其他配置值可以通过 config 获取, 例如
# my_important_option = config.get_main_option("my_important_option")def get_url():return str(settings.SQLALCHEMY_DATABASE_URI)def run_migrations_offline():"""以离线模式运行迁移。在这种情况下,上下文(Context)仅使用数据库 URL 进行配置,而不会创建引擎(Engine),尽管这里也可以使用引擎通过跳过引擎的创建,我们甚至不需要数据库驱动(DBAPI)可用在此模式下,对 context.execute() 的调用会将指定的 SQL 语句直接输出到迁移脚本中"""url = get_url()context.configure(url=url, target_metadata=target_metadata, literal_binds=True, compare_type=True)with context.begin_transaction():context.run_migrations()def run_migrations_online():"""以在线模式运行迁移。在这种情况下,我们需要创建一个引擎(Engine)并将连接(Connection)与上下文(Context)关联"""configuration = config.get_section(config.config_ini_section)configuration["sqlalchemy.url"] = get_url()connectable = engine_from_config(configuration,prefix="sqlalchemy.",poolclass=pool.NullPool,)with connectable.connect() as connection:context.configure(connection=connection, target_metadata=target_metadata, compare_type=True)with context.begin_transaction():context.run_migrations()if context.is_offline_mode():run_migrations_offline()
else:run_migrations_online()
  • 修改 script.py.mako 文件如下
"""${message}Revision ID: ${up_revision}
Revises: ${down_revision | comma,n}
Create Date: ${create_date}"""
from typing import Sequence, Unionfrom alembic import op
import sqlalchemy as sa# 就是加了这一行
import sqlmodel.sql.sqltypes${imports if imports else ""}# revision identifiers, used by Alembic.
revision: str = ${repr(up_revision)}
down_revision: Union[str, None] = ${repr(down_revision)}
branch_labels: Union[str, Sequence[str], None] = ${repr(branch_labels)}
depends_on: Union[str, Sequence[str], None] = ${repr(depends_on)}def upgrade() -> None:"""Upgrade schema."""${upgrades if upgrades else "pass"}def downgrade() -> None:"""Downgrade schema."""${downgrades if downgrades else "pass"}

注意:这个很重要,不然生成的迁移脚本有问题!!!

2.6 实战指令

  • 创建迁移文件
uv run alembic revision --autogenerate -m "Initial migration"
  • 执行迁移
uv run alembic upgrade head
  • 回滚迁移
uv run alembic downgrade -1
  • 查看当前版本
uv run alembic current
  • 查看历史版本
uv run alembic history

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

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

相关文章

LRU(最近最少使用)算法实现

核心思想与基本思路 LRU(Least Recently Used)算法是一种缓存淘汰策略,其核心思想是淘汰最近最少使用的数据。 最近使用原则:最近被访问的数据在未来被访问的概率更高,因此应保留在缓存中。淘汰机制:当缓…

现在有分段、句子数量可能不一致的中英文文本,如何用python实现中英文对照翻译(即每行英文对应相应的中文)

以下是处理分段且中英文句子数量可能不一致的文本的Python实现方案,包含分句、翻译和对齐功能: from googletrans import Translator import redef split_paragraphs(text):"""按空行分割段落并清洗"""return [p.strip()…

C语言每日一练——day_8

引言 针对初学者,每日练习几个题,快速上手C语言。第八天。(连续更新中) 采用在线OJ的形式 什么是在线OJ? 在线判题系统(英语:Online Judge,缩写OJ)是一种在编程竞赛中用…

基础知识《Redis解析》

Redis 详细解析与介绍 Redis(Remote Dictionary Server)是一个开源的高性能键值对(Key-Value)数据库,支持多种数据结构(如字符串、哈希、列表、集合等),广泛应用于缓存、消息队列、…

区跨链知识和概念

1、以太坊 Geth 源码解析 Geth(Go Ethereum)是以太坊官方提供的 Go 语言实现的客户端,广泛用于以太坊全节点运行、挖矿、DApp 开发等。理解 Geth 的源码有助于掌握以太坊区块链底层逻辑,如区块同步、EVM 执行、P2P 交互等。 2、…

Vue 计算属性与 Data 属性同名问题深度解析

文章目录 1. 问题背景与核心概念1.1 Vue 响应式系统架构1.2 核心概念定义 2. 同名问题的技术分析2.1 同名场景示例2.2 问题发生机制 3. 底层原理剖析3.1 Vue 初始化流程3.2 响应式系统关键代码 4. 问题解决方案4.1 最佳实践建议4.2 错误处理机制 5. 性能影响分析5.1 递归调用性…

Mybatis——基础操作、动态SQL

目录 一.基础操作 1.删除 2.新增 3.更新 4.查询 5.XML映射文件 二、动态SQL 1.<if> 2.<where> 3.<set> 4.<foreach> 5.<sql> 6.<include> 一.基础操作 1.删除 参数占位符&#xff1a; 注意&#xff1a; #{...}相比于${...}…

[设计模式]1_设计模式概览

摘要&#xff1a;设计模式原则、设计模式的划分与简要概括&#xff0c;怎么使用重构获得设计模式并改善代码的坏味道。 本篇作概览与检索用&#xff0c;后续结合源码进行具体模式深入学习。 目录 1、设计模式原理 核心原则&#xff08;语言无关&#xff09; 本质原理图 原…

C语言数据类型取值范围及格式化符号

一、数据类型取值范围与格式化输出符号表格 数据类型大小&#xff08;字节&#xff09;取值范围格式化输出符号char1-128到127<br>或0到255&#xff08;如果声明为unsigned char&#xff09;%c (字符)<br>%hhu (无符号)signed char1-1.2810到1.2710%hhd (有符号)u…

2024华东师范大学计算机复试上机真题

2024华东师范大学计算机复试机试真题 2023华东师范大学计算机复试机试真题 2022华东师范大学计算机复试机试真题 2024华东师范大学计算机复试上机真题 2023华东师范大学计算机复试上机真题 2022华东师范大学计算机复试上机真题 在线评测&#xff1a;传动门&#xff1a;pgcode…

星越L_内后视镜使用讲解

目录 1内后视镜角度调节 2,防炫目功能

Spring Boot应用首次请求性能优化实战:从数据库连接池到JVM调优

目录 问题现象与背景分析性能瓶颈定位方法论数据库连接池深度优化Spring Bean生命周期调优JVM层性能预热策略全链路监控体系建设生产环境验证方案总结与扩展思考1. 问题现象与背景分析 1.1 典型问题场景 在某互联网金融项目的Spring Boot应用上线后,运维团队发现一个关键现象…

【深度解析:以“不要的心态”获取所求的本质逻辑】

深度解析&#xff1a;以“不要的心态”获取所求的本质逻辑 一、文化基因&#xff1a;礼让传统与权力合法性的双重编码 儒家伦理的深层渗透 孔子提出"礼之用&#xff0c;和为贵"&#xff0c;将"辞让"纳入"仁义礼智信"的道德体系。《礼记》明确记…

C++【类和对象】(结束篇)

C类和对象 1.static成员2.友元3.内部类4.匿名对象5.对象拷贝时的编译器优化 1.static成员 用static修饰的成员变量叫做静态成员变量&#xff0c;静态成员一定要在类外进行初始化。静态成员变量为所有类的共享&#xff0c;放入静态区&#xff0c;不属于某个具体对象&#xff0c…

每日一题---腐烂的苹果(广度优先搜索)

腐烂的苹果 给定一个 nm nm 的网格&#xff0c;其中每个单元格中可能有三种值中的一个 0 , 1 , 2。 其中 0 表示这个格子为空、1 表示这个格子有一个完好的苹果&#xff0c;2 表示这个格子有一个腐烂的苹果。 腐烂的苹果每分钟会向上下左右四个方向的苹果传播一次病菌&…

maven笔记

maven介绍和作用 Maven 是一款为 Java 项目构建管理、依赖管理的工具&#xff08;软件&#xff09;&#xff0c;使用 Maven 可以自动化构建、测试、打包和发布项目&#xff0c;大大提高了开发效率和质量。 主要作用的理解&#xff1a; 依赖管理&#xff1a; 在编写项目时我…

模板-C++提高编程

C的一种编程思想称为泛型编程&#xff0c;用到的技术就是模板 C提供两种模板&#xff1a;函数模板和类模板。 1.函数模板 1.函数模板作用 建立一个通用函数&#xff0c;其返回值类型和形参类型可以用一个虚拟的类型来代替,提高代码复用性&#xff0c;将类型参数化。 2.语法…

基于Asp.net的物流配送管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

顺序表和链表的对比(一)

前言 今天给小伙伴们分享的是在数据结构中顺序表和链表的对比。它们在计算机科学和软件开发中具有广泛的应用&#xff0c;是理解更复杂数据结构&#xff08;如栈、队列、树、图等&#xff09;的基础。这次将会给大家从定义初始化&#xff0c;以及功能增删查改上进行详细对比&a…

星越L_外后视镜使用讲解

目录 1.外后视镜调节 2后视镜折叠 3.后视镜加热 1.外后视镜调节 L控制左边后视镜调节,上下拨动调整视野,一般此镜左右21分,上下55开。 R控制左边后视镜调节,上下拨动调整视野,一般此镜左右13分,上下55开。 2后视镜折叠 车辆解锁自动展开 车辆关闭自动折叠 严寒天气…