文章目录AlembicSQLAlchemy 配套的数据库迁移方案它能做什么几个实用的特性适合谁用AlembicSQLAlchemy 配套的数据库迁移方案做 Python 后端开发的人基本绕不开 SQLAlchemy。但 ORM 只解决了一半问题数据库 schema 的变更管理才是长期维护中的痛点。Alembic 就是 SQLAlchemy 作者自己写的迁移工具专门处理这件事。目前在 GitHub 上有 4,187 个 Star。它能做什么Alembic 的核心能力很直接帮你管理数据库结构的变更。具体来说它可以生成 ALTER 语句修改表结构提供迁移脚本机制来定义升级和回退步骤并按顺序执行这些脚本。迁移脚本用 Python 写成你可以在里面做任何事改表结构、迁移数据、甚至调用外部 API。这种灵活性是纯 SQL 迁移方案难以比拟的。每个脚本同时包含 upgrade 和 downgrade 两个函数升级出问题可以按原路回退。实际使用时你在本地改好 SQLAlchemy 的 model 定义然后让 Alembic 生成迁移脚本审查没问题后再执行到数据库。整个流程和 Django migrations、Rails migrations 的思路类似但配置更开放模板可以自定义。几个实用的特性自动生成迁移脚本。Alembic 的--autogenerate命令可以对比当前数据库状态和 SQLAlchemy model 的定义自动生成候选迁移脚本。表和字段的增删改都能检测出来。这省掉了手写大部分 DDL 的工作量复杂的变更还是需要人工调整。支持事务性 DDL。对于 PostgreSQL、SQL Server 这类支持事务 DDL 的数据库迁移失败时会自动回滚不用手动收拾残局。开发环境和生产环境都能更安心。能输出纯 SQL 脚本。很多生产环境不给直接执行 DDL 的权限需要 DBA 审核。Alembic 可以把一系列迁移导出成 SQL 文件方便走审批流程。同时它还提供了 bulk_insert 等辅助函数让数据迁移操作也能兼容纯脚本模式。非线性版本控制。Alembic 的迁移脚本用 UUID 标识依赖关系在脚本里明确标注。整个迁移结构是一个有向无环图支持分支、多根节点、合并点。团队并行开发多个功能时各自写迁移脚本再合并比线性序号灵活得多。解决 SQLite 的 ALTER 限制。SQLite 不支持直接修改表结构Alembic 通过批量迁移模式把多个变更打包成一次重建操作绕过了这个限制。适合谁用如果你已经在用 SQLAlchemy那 Alembic 是最自然的选择。它由同一个人维护API 风格一致兼容性有保障。如果你在用其他 ORM 或原生 SQLAlembic 也可以独立使用。它提供的 ALTER 构造库基于 SQLAlchemy 的 DDLElement任何 Python 项目都能调用。对于需要严格管控数据库变更的团队Alembic 的 SQL 输出功能和脚本化执行模式能很好地嵌入现有的运维流程。从 Star 数和社区活跃度来看Alembic 已经是 Python 生态里数据库迁移的事实标准。如果你是 SQLAlchemy 用户还没用上迁移工具那值得花时间了解一下。总之Alembic 是个务实的基础设施型工具。它没有花哨的界面但把数据库迁移这件事做得足够扎实。在 SQLAlchemy 生态里它是不可或缺的一环。迁移这件事做得足够扎实。在 SQLAlchemy 生态里它是不可或缺的一环。