Este documento describe el sistema de migraciones de base de datos implementado en OxiCloud para gestionar cambios de esquema de forma controlada y segura.
## Descripción General
OxiCloud utiliza un sistema de migraciones basado en archivos SQL versionados para garantizar que los cambios en la estructura de la base de datos sean:
- Versionados y rastreables
- Aplicados de forma consistente en todos los entornos
- Reproducibles y comprobables
- Independientes del código de la aplicación
## Estructura de Directorios
```
OxiCloud/
├── migrations/ # Directorio principal de migraciones
COMMENTONTABLEauth.tagsIS'Almacena etiquetas definidas por usuarios';
COMMENTONTABLEauth.file_tagsIS'Relación muchos-a-muchos entre archivos y etiquetas';
```
## Guía de Buenas Prácticas
1.**Migraciones Incrementales**: Cada migración debe representar un cambio atómico y coherente.
2.**Migraciones Idempotentes**: Cuando sea posible, usa comandos que pueden ejecutarse múltiples veces sin errores (ej. `CREATE TABLE IF NOT EXISTS`).
3.**Migraciones Forward-Only**: Diseña las migraciones para avanzar, no para revertir. Si necesitas deshacer un cambio, crea una nueva migración.
4.**Compatibilidad Hacia Adelante**: Las migraciones deben ser compatibles con el código existente y el que se va a desplegar.
5.**Prueba Antes de Desplegar**: Prueba las migraciones en un entorno similar al de producción antes de aplicarlas.
6.**Documentación**: Documenta el propósito y los cambios clave de cada migración con comentarios dentro del archivo SQL.
## Solución de Problemas
### Verificación del Estado de las Migraciones
Para verificar qué migraciones se han aplicado, OxiCloud incluye detección en tiempo de inicio:
```rust
// Desde src/common/db.rs
letmigration_check=sqlx::query("SELECT EXISTS (SELECT 1 FROM pg_tables WHERE schemaname = 'auth' AND tablename = 'users')")
.fetch_one(&pool)
.await;
matchmigration_check{
Ok(row)=>{
lettables_exist: bool=row.get(0);
if!tables_exist{
tracing::warn!("Las tablas de la base de datos no existen. Por favor, ejecuta las migraciones con: cargo run --bin migrate --features migrations");
}
},
Err(_)=>{
tracing::warn!("No se pudo verificar el estado de las migraciones. Por favor, ejecuta las migraciones con: cargo run --bin migrate --features migrations");
}
}
```
### Problemas Comunes
1.**Error de conexión a la base de datos**: Verifica la URL de conexión en la variable de entorno `DATABASE_URL`.
2.**Conflictos de migración**: Si una migración falla, revisa los mensajes de error para identificar conflictos con el esquema existente.
3.**Permisos insuficientes**: Asegúrate de que el usuario de la base de datos tenga permisos suficientes para crear esquemas, tablas e índices.