数据库迁移工具——Alembic

Alembic 是一个专为 SQLAlchemy 设计的数据库迁移工具,它可以帮助你以版本控制的方式管理和应用数据库结构的变更。你可以把它理解为数据库结构变更的"Git"。

下面是一份从零开始的 Alembic 使用教程。

🛠️ 第一步:安装与初始化

  1. 安装 Alembic

    在你的项目环境中使用 pip 安装 Alembic。

    bash 复制代码
    uv add alembic sqlalchemy
  2. 初始化 Alembic 环境

    进入你的项目根目录,运行以下命令来创建一个 alembic 目录和相关配置文件。

    bash 复制代码
    alembic init alembic

    执行后会生成如下结构:

    • alembic.ini: Alembic 的主配置文件。
    • alembic/: 迁移脚本目录。
      • env.py: 迁移脚本的运行环境配置。
      • versions/: 存放所有迁移脚本文件的目录。

⚙️ 第二步:配置 Alembic

初始化完成后,需要进行两步关键配置。

  1. 配置数据库连接 (alembic.ini)

    打开 alembic.ini 文件,找到 sqlalchemy.url 这一行,将其修改为你的数据库连接地址。

    ini 复制代码
    sqlalchemy.url = mysql+pymysql://用户名:密码@主机地址:端口/数据库名?charset=utf8mb4
  2. 关联 SQLAlchemy 模型 (alembic/env.py)

    打开 alembic/env.py 文件,你需要在这里导入你的 SQLAlchemy 模型基类(通常是 Base),并让 Alembic 知道它。

    • 在文件顶部导入你的 Base 对象。

    • 找到 target_metadata = None 这一行,将其修改为:

      python 复制代码
      from my_project.models import Base  # 请根据你的项目结构调整导入路径
      
      # ...
      
      target_metadata = Base.metadata

    这样,Alembic 才能通过你的模型定义来自动检测数据库结构的变化。

⚙️ 第二步配置数据库连接进阶版

直接将账号密码配置在 alembic.ini 不安全,让它读取环境变量中的配置。

  • 第一步:将 alembic.ini 数据库配置 置为空

    ini 复制代码
    sqlalchemy.url =
  • 第二步:需改env.py env.py

    python 复制代码
    ...
    load_env_files()
    def get_url():
        db_url = os.getenv("DATABASE_URL")
    
        if not db_url:
            raise ValueError("未找到环境变量 'DATABASE_URL',请检查配置")
    
        return db_url
    
    
    def run_migrations_offline() -> None:
        url = get_url()
        context.configure(
            url=url,
            target_metadata=target_metadata,
            literal_binds=True,
            dialect_opts={"paramstyle": "named"},
        )
    
        with context.begin_transaction():
            context.run_migrations()
    
    
    def run_migrations_online() -> None:
        configuration = config.get_section(config.config_ini_section)
        configuration["sqlalchemy.url"] = get_url()
    
        connectable = engine_from_config(
            configuration,
            prefix="sqlalchemy.",
            poolclass=pool.NullPool,
        )
        ...

🚀 第三步:创建并执行迁移

当你创建或修改了 SQLAlchemy 模型后,就可以开始迁移了。

  1. 生成迁移脚本

    使用 --autogenerate 参数,Alembic 会自动比对你的模型和数据库的差异,并生成相应的迁移脚本。

    bash 复制代码
    alembic revision --autogenerate -m "描述本次变更,例如:创建用户表"

    命令执行后,会在 alembic/versions/ 目录下生成一个带时间戳的迁移脚本文件。

  2. 执行迁移 (升级数据库)

    检查生成的迁移脚本无误后,运行以下命令将变更应用到数据库。

    bash 复制代码
    alembic upgrade head

    head 代表最新的版本。执行成功后,数据库结构就会更新。

⏪ 第四步:回滚迁移

如果迁移出现问题,或者你需要撤销某次变更,可以使用回滚命令。

  • 回滚到上一个版本

    bash 复制代码
    alembic downgrade -1
  • 回滚到指定版本

    bash 复制代码
    alembic downgrade <版本号>
  • 回滚到初始状态 (删除所有由迁移创建的表)

    bash 复制代码
    alembic downgrade base

📜 常用命令速查

命令 作用
alembic init <dir> 初始化 Alembic 环境
alembic revision --autogenerate -m "msg" 自动生成迁移脚本
alembic upgrade head 将数据库升级到最新版本
alembic downgrade -1 回滚到上一个版本
alembic current 查看数据库当前的版本
alembic history 查看所有迁移历史

💡 最佳实践提示

  • 检查自动生成的脚本--autogenerate 功能非常强大,但并非万无一失。对于复杂的变更(如字段重命名、删除操作),它可能无法准确识别。因此,在执行 upgrade 之前,务必人工检查一下生成的迁移脚本,确保 upgrade()downgrade() 函数中的逻辑是正确的。
  • 版本控制 :建议将 alembic/versions/ 目录下的所有迁移脚本纳入 Git 等版本控制系统,以便团队协作和追踪变更历史。
相关推荐
BU摆烂会噶9 分钟前
【LangGraph】House_Agent 实战(四):预定流程 —— 中断与人工干预
android·人工智能·python·langchain
AI玫瑰助手9 分钟前
Python运算符:比较运算符(等于不等等于大于小于)与返回值
android·开发语言·python
GIOTTO情21 分钟前
Infoseek舆情处置系统的技术实现与落地实践
python
new_dev39 分钟前
Python实现Android自动化打包工具:加固、签名、多渠道一键完成
android·python·自动化
天天进步20151 小时前
从零打造 Python 全栈项目:智能教学辅助系统
开发语言·人工智能·python
带带弟弟学爬虫__1 小时前
dyAPP数据采集-个人主页、发布、搜索、评论
服务器·python·算法·flutter·java-ee·django
还是鼠鼠1 小时前
AI掘金头条新闻系统 (Toutiao News)-相关推荐
后端·python·mysql·fastapi·web
数智工坊1 小时前
PyCharm 运行 Python 脚本总自动进 Test 模式?附 RT-DETRv2 依赖缺失终极排坑
开发语言·ide·人工智能·python·pycharm
AI砖家2 小时前
每日一个skill:web-artifacts-builder,构建复杂 Claude.ai HTML Artifact 的生产力工具包
java·前端·人工智能·python
彦为君2 小时前
JavaSE-05-字符串(全面深入)
java·开发语言·python·ai·ai编程