Alembic vs Flyway: migrações de banco de dados comparadas
O Alembic é a ferramenta de migração de Python/SQLAlchemy com autogeração; o Flyway é um runner de migração agnóstico de linguagem, versionado em SQL, amplamente usado em ambientes JVM e poliglotas.
O Alembic se integra fortemente ao SQLAlchemy, pode autogerar migrações a partir de diffs de modelos e é o padrão para projetos Python. O Flyway executa migrações versionadas em SQL (e opcionalmente Java) em ordem, é agnóstico de linguagem e é popular em times Java e poliglotas por seu modelo de aplicação simples e repetível.
| Alembic | Flyway | |
|---|---|---|
| Ecossistema | Python / SQLAlchemy | Agnóstico de linguagem (raízes JVM) |
| Formato de migração | Scripts Python | SQL versionado (+ Java) |
| Autogeração | Sim (a partir dos modelos) | Não (escreva SQL) |
| Modelo de aplicação | Grafo de revisões | Versões ordenadas |
| Melhor para | Apps Python | Poliglota / JVM, SQL-first |
Em CI
Ambos aplicam migrações contra um banco de dados em CI - o Alembic via seu comando upgrade, o Flyway via flyway migrate. O Alembic se encaixa em pipelines Python e pode comparar modelos; o Flyway entra de forma limpa em qualquer pipeline como CLI ou container. Execute as migrações contra um serviço de DB descartável para validá-las em cada PR.
Acelere
Faça cache das dependências (ou baixe a imagem do Flyway) e migre contra um DB descartável. Ambos rodam em CI runners; managed runners mais rápidos encurtam a instalação e a aplicação das migrações.
Decide with your own numbers, not a feature table
Feature comparisons age badly and rarely decide anything, because both tools in a mature category can do the job. What differs is how each behaves on your repository, and that takes one afternoon to measure.
# time a cold install with each candidate, cache cleared
hyperfine --prepare "rm -rf node_modules" --warmup 1 \
"<tool-a> install" "<tool-b> install"
# and the thing CI actually pays for: a cold run with no local cache
docker run --rm -v "$(pwd):/w" -w /w node:22 sh -c "<tool> install"What actually changes when you switch
- Lockfile format. A switch is a one-way door for anyone still on the old tool until everyone migrates, so plan it as a single coordinated change.
- Resolution strictness. Tools differ on whether an undeclared transitive import works, and the stricter one will surface latent bugs as new failures.
- CI cache configuration. The cache path and key differ per tool; carrying over the old ones silently disables caching.
- Everyone on the team and every runner must move together. Pin the version so they cannot drift.
O veredito
Projeto Python/SQLAlchemy que quer migrações autogeradas: Alembic. Time poliglota ou JVM que quer migrações agnósticas de linguagem e versionadas em SQL: Flyway. Escolha pelo ecossistema e por preferir migrações em código ou em SQL puro.