背景与问题

  • 痛点 / 需求: 在fastapi中使用sqlachemy的时候,我们在代码里建立了数据库模型models,数据库表结构是需要根据模型来创建。 但是当模型发生变更时,我们需要手动修改数据库表结构,这就很麻烦。 alembic可以帮助我们自动管理数据库表结构的变更。

Alembic 是一个轻量级的数据库迁移工具,与 SQLAlchemy 配合使用。它可以帮助你追踪数据库模型的变化,并能够轻松地进行版本升级和回滚。

使用方法

  1. 安装alembic
     pip install alembic
    
  2. 初始化alembic
     alembic init alembic
    

    这会在项目根目录下创建一个alembic目录,里面包含了一些配置文件和迁移脚本。

  3. 配置alembic 打开alembic.ini文件,修改数据库连接字符串为你的数据库连接字符串。 sqlalchemy.url = mysql+pymysql://root:123456@localhost:3306/test_db

  4. 编写数据库模型 在models.py文件中编写数据库模型,例如: ``` python from sqlalchemy import Column, Integer, String from sqlalchemy.orm import declarative_base

  5. 修改alembic/env.py文件 打开alembic/env.py文件,修改target_metadata为你的数据库模型的Base.metadata,例如:
     from models import Base
     target_metadata = Base.metadata
    
  6. 创建数据库迁移脚本
     alembic revision --autogenerate -m "create users table"
    

    这会在alembic/versions目录下创建一个迁移脚本,文件名类似20260223_create_users_table.py。

  7. 应用数据库迁移(更新到数据库)
     alembic upgrade head
    

    这会将数据库 schema 升级到最新版本。

  8. 当数据库表更新的时候,需要重新创建迁移脚本
     alembic revision --autogenerate -m "update something ..."
    

    这会在alembic/versions目录下创建一个新的迁移脚本,文件名类似20260223_update_users_table.py。

  9. 应用数据库迁移
     alembic upgrade head
    

    这会将数据库 schema 升级到最新版本。

  10. 版本回退
    <!-- 回退一个版本 -->
    alembic downgrade -1
    <!-- 回退到指定版本 -->
    alembic downgrade xxxxxxx_update_users_table
    <!-- 回退到上一个版本 -->
    alembic downgrade head
    

    这会将数据库 schema 回退到上一个版本。 注意:回退后,数据库中已有的数据会被删除,所以请谨慎操作。

  11. 其他
    • 查看数据库迁移历史
        alembic history
      
    • 查看当前数据库版本
        alembic current
      
    • 生成 SQL 但不执行
        alembic upgrade head --sql
      

      这会生成升级数据库 schema 的 SQL 语句,但不会执行。

⚠️注意: target_metadata = None 要注释掉,否则会覆盖

参考