如何在SQLModel中实现类似Django/flask-migrate的数据库迁移?
问题原因
SQLModel.metadata.create_all(engine) 仅会创建数据库中不存在的表,不会对比和同步已存在表的结构变更,因此修改字段类型、增删字段后重复调用该方法不会生效,属于预期行为。
数据库迁移方案
SQLModel 基于 SQLAlchemy 开发,可以直接使用 SQLAlchemy 生态的官方迁移工具 Alembic 实现表结构自动同步,功能和 Django migrations、flask-migrate 完全对齐(flask-migrate 底层也是封装的 Alembic)。
具体操作步骤
- 第一步:安装Alembic
pip install alembic - 第二步:初始化迁移目录
在项目根目录执行命令,会自动生成alembic目录和配置文件alembic.inialembic init alembic - 第三步:修改迁移配置
- 打开
alembic.ini,将sqlalchemy.url的值替换为你自己的数据库连接串,例如:sqlalchemy.url = postgresql://user:pass@localhost/dbname - 打开
alembic/env.py,修改元数据配置,导入你的所有模型和SQLModel的元数据:# 原有导入代码不变,新增以下导入 from sqlmodel import SQLModel # 替换为你自己的模型文件导入路径 from your_models import Hero # 修改target_metadata赋值 target_metadata = SQLModel.metadata
- 打开
- 第四步:生成迁移脚本
执行命令会自动对比模型和现有表结构的差异,生成迁移脚本,后面的备注可以自定义alembic revision --autogenerate -m "修改Hero表status字段类型" - 第五步:执行迁移同步到数据库
alembic upgrade head
注意事项
自动生成的迁移脚本建议先打开检查逻辑是否符合预期,部分特殊变更(例如字段默认值调整、枚举类型变更等)可能存在识别偏差,确认无误后再执行迁移操作即可。
内容的提问来源于stack exchange,提问作者faris404
相关产品推荐
相关产品推荐

