Reusable Postgres migration bootstrap and execution toolkit
Project description
db_migration_kit
Kit reutilizable para revisar y ejecutar migraciones de esquema de base de datos en proyectos Python.
Objetivo
Este paquete busca separar tres responsabilidades:
- describir el esquema deseado
- revisar el impacto antes de aplicarlo
- ejecutar migraciones de forma controlada
La idea central es que el flujo normal no sea aplicar y ya, sino:
synth: sintetizar el estado deseadodiff: comparar estado actual vs. estado deseadoreview: explicar qué cambiaupgrade: aplicar cambios aceptados
Principios
- reutilizable entre proyectos
- documentación y salida orientadas a revisión humana
- desacoplado del arranque de la aplicación
- desacoplado de un motor específico
- extensible mediante providers
Providers
El kit no asume una base de datos concreta.
Cada proyecto utiliza un provider que conoce:
- cómo inspeccionar el esquema actual
- cómo construir el esquema deseado
- cómo calcular diferencias
- cómo ejecutar migraciones para ese backend
Providers disponibles en esta versión:
sqlalchemy-sqlitesqlalchemy-postgres
Ambos comparten una base común en SQLAlchemy y Alembic, pero el comportamiento de inspección puede variar por dialecto. Por ejemplo, postgres permite revisar enums nativos con más precisión que sqlite.
Flujo local
poetry run python -m db_migration_kit.cli inspect-project --root .
poetry run python -m db_migration_kit.cli bootstrap --root .
poetry run python -m db_migration_kit.cli doctor --project-module migration_project
poetry run python -m db_migration_kit.cli review --project-module migration_project
poetry run python -m db_migration_kit.cli diff --project-module migration_project
Flujo generico de integracion
Para integrar el kit en un proyecto Python como paquete publicado:
- instalar
db-migration-kitdesde PyPI - correr
inspect-projectpara detectar provider, source y puntos de integracion - correr
bootstrappara generarmigration_project.pyymigrations/* - revisar el
migration_project.pygenerado y confirmar la forma correcta de construir la URL de la base - correr
doctorpara validar que el proyecto de migracion es cargable - correr
reviewydiffcontra una base real
Ejemplo de instalacion:
poetry add db-migration-kit
Comandos base:
poetry run python -m db_migration_kit.cli inspect-project --root .
poetry run python -m db_migration_kit.cli bootstrap --root .
poetry run python -m db_migration_kit.cli doctor --project-module migration_project
poetry run python -m db_migration_kit.cli review --project-module migration_project
poetry run python -m db_migration_kit.cli diff --project-module migration_project
Como leer el resultado
El kit no usa una sola categoria de cambio.
Lecturas principales:
agregar,modificar,eliminar: drift real entre la base y el esquema deseadoriesgo: el kit detecto un caso ambiguo que requiere revision manualpendiente: diferencia esperable pero todavia no materializada
En proyectos con persistence_kit, una tabla puede aparecer como:
pendiente / tabla-lazy: el repositorio esta registrado y forma parte del esquema deseado, pero la tabla aun no existe fisicamente porquepersistence_kitla crea de forma lazy en el primer uso
Eso no debe interpretarse automaticamente como una migracion obligatoria.
Primera snapshot
La primera snapshot no significa necesariamente "aplicar cambios ya". Significa capturar una linea base entendible del proyecto.
El flujo recomendado para una primera snapshot es:
- levantar una base controlada del proyecto
- correr
review - separar hallazgos en tres grupos:
- drift real
- objetos legacy
- materializacion lazy pendiente
- usar
diffcomo salida estructurada de esa primera linea base
Ejemplo:
poetry run python -m db_migration_kit.cli review --project-module migration_project
poetry run python -m db_migration_kit.cli diff --project-module migration_project
Si el resultado contiene solo pendiente / tabla-lazy, la lectura correcta es:
- el esquema deseado ya quedo bien identificado
- no hay drift duro relevante
- solo faltan tablas que el sistema crea cuando realmente usa esos repositorios
Recomendacion para proyectos con persistence_kit
Si el proyecto usa persistence_kit, la expectativa correcta es:
- el schema source describe lo que deberia existir segun
register_entity - la base puede no tener aun todas las tablas si algunos repositorios nunca se han usado
reviewno deberia forzar a cambiar ese comportamiento
Por eso el kit distingue entre:
- drift estructural real
- materializacion lazy pendiente
La primera snapshot debe preservar esa distincion, no borrarla.
Snapshots versionadas
El kit guarda snapshots versionadas por proyecto en:
migrations/snapshots/
Esa ruta se deriva automaticamente desde migrations_dir, asi que el kit sabe siempre donde buscarlas.
Comandos:
poetry run python -m db_migration_kit.cli snapshot-create --project-module migration_project
poetry run python -m db_migration_kit.cli snapshot-create --project-module migration_project --label baseline
poetry run python -m db_migration_kit.cli snapshot-list --project-module migration_project
poetry run python -m db_migration_kit.cli snapshot-show --project-module migration_project --version-id v001
poetry run python -m db_migration_kit.cli snapshot-delete --project-module migration_project --version-id v001
poetry run python -m db_migration_kit.cli snapshot-apply --project-module migration_project --version-id v001
poetry run python -m db_migration_kit.cli snapshot-rollback --project-module migration_project --version-id v001
Convencion:
v001,v002,v003: snapshots secuencialesv001-baseline,v002-post-auth: snapshots con etiqueta opcional
Cada snapshot guarda:
reviewdiffdesired_snapshotalembic_revision- metadatos de proyecto, provider, fecha y version
Como crear la primera snapshot
Si ya validaste el proyecto con doctor, la primera snapshot versionada se crea asi:
poetry run python -m db_migration_kit.cli snapshot-create --project-module migration_project --label baseline
Luego puedes listar y revisar:
poetry run python -m db_migration_kit.cli snapshot-list --project-module migration_project
poetry run python -m db_migration_kit.cli snapshot-show --project-module migration_project --version-id v001-baseline
La primera snapshot no reemplaza review ni diff. Los conserva como baseline versionado.
Aplicar una snapshot
Si el proyecto ya tiene revisiones Alembic reales, el kit puede aplicar o volver a una snapshot usando la revision asociada guardada dentro de la snapshot.
Comandos:
poetry run python -m db_migration_kit.cli snapshot-apply --project-module migration_project --version-id v003
poetry run python -m db_migration_kit.cli snapshot-rollback --project-module migration_project --version-id v001-baseline
Semantica:
snapshot-apply: mueve la base a la revision Alembic asociada a la snapshot elegidasnapshot-rollback: usa la misma resolucion pero con intencion semantica de volver a una version anterior
El usuario trabaja con snapshots. Alembic se usa por detras como motor de upgrade/downgrade.
Que significa que una snapshot sea "ejecutable"
Una snapshot puede estar en dos estados:
- semantica: describe el esquema esperado, pero no tiene una revision Alembic asociada distinta
- ejecutable: tiene una
alembic_revisionreal y el kit puede mover la base hacia esa version usandosnapshot-applyosnapshot-rollback
Ejemplo:
v001-baseline -> alembic_revision = basev002-after-phone -> alembic_revision = c3afdddecb7e
En ese escenario:
v001-baselinedescribe el baseline inicialv002-after-phoneya representa una version ejecutable del esquema
Flujo recomendado para crear una primera version ejecutable
- integrar el kit
- validar el proyecto con
doctor - revisar el estado actual con
reviewydiff - crear la baseline inicial
- introducir un cambio real de esquema en una entidad ya materializada
- volver a correr
reviewydiff - crear una nueva snapshot
- dejar que el kit genere una revision Alembic y la asocie a esa snapshot
- aplicar esa snapshot con
snapshot-apply
Comandos tipicos:
poetry run python -m db_migration_kit.cli snapshot-create --project-module migration_project --label baseline
poetry run python -m db_migration_kit.cli review --project-module migration_project
poetry run python -m db_migration_kit.cli diff --project-module migration_project
poetry run python -m db_migration_kit.cli snapshot-create --project-module migration_project --label after-change
poetry run python -m db_migration_kit.cli snapshot-list --project-module migration_project
poetry run python -m db_migration_kit.cli snapshot-apply --project-module migration_project --version-id v002-after-change
Como interpretar review y diff
El significado operativo de la salida es:
agregar,modificar,eliminar: drift real o cambio de esquema aplicablependiente / tabla-lazy: el esquema deseado incluye esa tabla, pero el proyecto la materializa lazy y todavia no existe fisicamenteriesgo: el kit detecto algo ambiguo y requiere revision manual
Entonces:
- si
reviewqueda vacio, la base esta alineada con el esquema deseado - si solo queda
pendiente / tabla-lazy, la base esta alineada salvo la materializacion lazy esperada - si hay
agregar/modificar/eliminar, existe drift o cambio real de esquema
Modo de trabajo en desarrollo local
Si estas desarrollando el kit mismo, puedes iterar localmente antes de publicar una nueva version:
- actualizar el codigo del paquete
- reconstruir o reinstalar el entorno local del proyecto consumidor
- usar snapshots para versionar el estado esperado
- usar
snapshot-applypara probar upgrades reales
Modo de trabajo en un entorno persistente
Si el entorno tiene datos y no debe reiniciarse desde cero:
- no destruir volumenes como rutina
- crear una snapshot antes de actualizar codigo
- hacer pull del codigo
- reconstruir imagen
- revisar
review/diff - aplicar la snapshot objetivo
- volver a validar el esquema
Secuencia recomendada:
poetry run python -m db_migration_kit.cli snapshot-create --project-module migration_project --label pre-pull
git pull
poetry install
poetry run python -m db_migration_kit.cli review --project-module migration_project
poetry run python -m db_migration_kit.cli diff --project-module migration_project
poetry run python -m db_migration_kit.cli snapshot-apply --project-module migration_project --version-id <objetivo>
poetry run python -m db_migration_kit.cli review --project-module migration_project
Integracion con CI/CD
El kit puede integrarse en CI/CD de dos formas:
- validacion
- correr
doctor - correr
diff - fallar si hay drift real inesperado
- despliegue controlado
- aplicar una snapshot ejecutable
- validar con
review - desplegar la aplicacion solo si el esquema queda alineado
Ejemplo de validacion:
python -m db_migration_kit.cli doctor --project-module migration_project
python -m db_migration_kit.cli diff --project-module migration_project
Ejemplo de despliegue:
python -m db_migration_kit.cli snapshot-apply --project-module migration_project --version-id v003-release
python -m db_migration_kit.cli review --project-module migration_project
Limites actuales
El kit ya puede:
- inspeccionar el esquema actual
- sintetizar el esquema deseado
- generar snapshots versionadas
- asociar snapshots con revisiones Alembic
- aplicar snapshots usando Alembic por detras
Pero aun hay que revisar manualmente:
- cambios destructivos delicados
- migraciones de datos
- cambios que requieren backfill
- escenarios no lineales de ramas Alembic
Estructura mínima por proyecto
Cada proyecto solo necesita:
- una carpeta de migraciones
- un archivo
migration_project.py - un objeto
projectque implemente el contrato deMigrationProject
El kit puede generar estos archivos automáticamente a partir de un escaneo inicial del proyecto.
Estado actual
La versión actual deja listo:
- contrato de provider
- snapshots y diff de esquema
- revisión de columnas, índices, foreign keys y enums
- detección básica de posibles renombres
- inspección inicial del proyecto
- bootstrap automático de archivos mínimos
- runner reusable
- scaffold inicial
- comandos
synth,diff,review,upgrade,downgrade,stamp
La parte de migraciones reales puede crecer por provider sin acoplar el kit a un proyecto particular.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file db_migration_kit-1.5.0.tar.gz.
File metadata
- Download URL: db_migration_kit-1.5.0.tar.gz
- Upload date:
- Size: 26.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0c38179f0e8d086225fe6c73b693872188a98fb38bc10b40ef572349102ba20d
|
|
| MD5 |
f3399fc379e58c352f96dbaf2be6f9d4
|
|
| BLAKE2b-256 |
aece0d7b305d97c2cbdb798e69495e8e1d054989757d34068448cbeb2fa62c3d
|
Provenance
The following attestation bundles were made for db_migration_kit-1.5.0.tar.gz:
Publisher:
publish-pypi.yml on AndresFSerrano/db-migration-kit
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
db_migration_kit-1.5.0.tar.gz -
Subject digest:
0c38179f0e8d086225fe6c73b693872188a98fb38bc10b40ef572349102ba20d - Sigstore transparency entry: 1168331150
- Sigstore integration time:
-
Permalink:
AndresFSerrano/db-migration-kit@e8386b807d235438b06fa3034341ecd22aa69361 -
Branch / Tag:
refs/tags/v1.5.0 - Owner: https://github.com/AndresFSerrano
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@e8386b807d235438b06fa3034341ecd22aa69361 -
Trigger Event:
release
-
Statement type:
File details
Details for the file db_migration_kit-1.5.0-py3-none-any.whl.
File metadata
- Download URL: db_migration_kit-1.5.0-py3-none-any.whl
- Upload date:
- Size: 31.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4bf13a44fd0d98f5775c658a958b68c4e5ca8ca3ac73803e365909c725cb2a2b
|
|
| MD5 |
b00bd05aa05d492b6a5aed91b3ca29fe
|
|
| BLAKE2b-256 |
f7ff8506b86a08302c71623d755ae8837dbb03835416bd02363ce6e80efaec9d
|
Provenance
The following attestation bundles were made for db_migration_kit-1.5.0-py3-none-any.whl:
Publisher:
publish-pypi.yml on AndresFSerrano/db-migration-kit
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
db_migration_kit-1.5.0-py3-none-any.whl -
Subject digest:
4bf13a44fd0d98f5775c658a958b68c4e5ca8ca3ac73803e365909c725cb2a2b - Sigstore transparency entry: 1168331192
- Sigstore integration time:
-
Permalink:
AndresFSerrano/db-migration-kit@e8386b807d235438b06fa3034341ecd22aa69361 -
Branch / Tag:
refs/tags/v1.5.0 - Owner: https://github.com/AndresFSerrano
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@e8386b807d235438b06fa3034341ecd22aa69361 -
Trigger Event:
release
-
Statement type: