用途:在已存在的 SQLAlchemy 2.x Base.metadata 之上接入并运行 Alembic 数据库迁移,让同一份迁移历史适用于 SQLite、PostgreSQL、MySQL 三种方言。前提是模型与 Base.metadata 已由 sqlalchemy 技能定义好,本技能只负责把 Alembic 接上去。
主要能力:初始化迁移环境(alembic init alembic,生成 alembic.ini、env.py、script.py.mako、versions/);从环境变量读取数据库 URL 而非硬编码;把 target_metadata 指向 Base.metadata 以支持 --autogenerate 比对;编写、审查、应用与回滚迁移;处理多分支 head 合并;决定用 create_all() 还是 Alembic,以及为已建库打基线 stamp。
使用方式:在 env.py 中用 config.set_main_option("sqlalchemy.url", os.environ["DB_URL"]) 注入连接串;导入模型并设 target_metadata = Base.metadata;在线 runner 中配置 render_as_batch=True、compare_type=True、compare_server_default=True,并使用 NullPool。创建迁移用 alembic revision -m "..."(空)或 alembic revision --autogenerate -m "..."(草稿)。应用与检查用 alembic upgrade head、alembic upgrade +1、alembic downgrade -1、alembic downgrade base、alembic current、alembic history、alembic heads。多方言改动统一写成 op.batch_alter_table(...) 形式。多 head 用 alembic merge -m "..." rev_a rev_b 合并。异步栈可参考 run_sync(do_run_migrations) 的 greenlet 桥接写法,但通常仍建议用同步驱动 URL。
适用场景:需要跨 SQLite/PostgreSQL/MySQL 维护单一迁移历史的项目;已有 create_all() 建好的库要改用 Alembic;需要可回滚的版本化 schema 变更。
限制与注意:autogenerate 只是草稿,存在已知盲区——表/列重命名会被识别为 drop+add 导致数据丢失,多数 server_default 变更、CHECK 与部分命名约束、部分索引和列类型变更不可靠,未导入的模型完全不可见,因此每个生成脚本都必须人工审查后再应用。SQLite 不支持多数 ALTER,必须用 batch 的 move-and-copy 方式,并配合 naming_convention 保留命名约束。每个 upgrade() 都应有真正互逆的 downgrade()。downgrade base 会清空 schema,生产环境慎用。资料未提供收费、价格与平台信息。