Saltar a contenido

Migraciones

Las migraciones son una especie de control de versiones para tu base de datos. Cada migración define un cambio en la base de datos y cómo deshacerlo. Modificando tu base de datos mediante migraciones creas una manera consistente, testable y fácil de compartir, de evolucionar tu base de datos a lo largo del tiempo.

// Una migración de ejemplo.
struct MyMigration: Migration {
    func prepare(on database: Database) -> EventLoopFuture<Void> {
        // Haz un cambio en la base de datos.
    }

    func revert(on database: Database) -> EventLoopFuture<Void> {
        // Deshaz el cambio hecho en `prepare`, si es posible.
    }
}

Si estás usando async/await deberías implementar el protocolo AsyncMigration:

struct MyMigration: AsyncMigration {
    func prepare(on database: Database) async throws {
        // Haz un cambio en la base de datos.
    }

    func revert(on database: Database) async throws {
        // Deshaz el cambio hecho en `prepare`, si es posible.
    }
}

En el método prepare haces cambios en la Database proporcionada. Pueden ser cambios en el esquema de la base de datos, como añadir o quitar una tabla, colección, campo o restricción. También pueden modificar el contenido de la base de datos, por ejemplo creando una nueva instancia de un modelo, actualizando valores de campos o haciendo una limpieza general.

En el método revert deshaces estos cambios, siempre y cuando sea posible. Tener la capacidad de deshacer migraciones puede facilitar el prototipado y el testing. También te ofrece un plan de recuperación si un despliegue en producción no marcha según lo planeado.

Registro

Las migraciones son registradas en tu aplicación usando app.migrations.

import Fluent
import Vapor

app.migrations.add(MyMigration())

Puedes añadir una migración a una base de datos específica mediante el parámetro to, sino se usará la base de datos por defecto.

app.migrations.add(MyMigration(), to: .myDatabase)

Las migraciones deberían estar listadas según el orden de dependencia. Por ejemplo, si MigrationB depende de MigrationA, debería añadirse a app.migrations la segunda.

Migrar

Para migrar tu base de datos, ejecuta el comando migrate.

swift run App migrate

También puedes ejecutar este comando desde Xcode. El comando de migración comprobará la base de datos para ver si se han registrado nuevas migraciones desde la última ejecución. Si hay nuevas migraciones pedirá confirmación antes de ejecutarlas.

Revertir

Para deshacer una migración en tu base de datos, ejecuta migrate con la marca --revert.

swift run App migrate --revert

El comando comprobará la base de datos para ver que conjunto de migraciones fue ejecutado la vez anterior y pedirá confirmación antes de revertirlas.

Migración Automática

Si quieres que tus migraciones se ejecuten automáticamente antes de ejecutar otros comandos, añade la marca --auto-migrate.

swift run App serve --auto-migrate

También puedes hacerlo de manera programática.

try app.autoMigrate().wait()

// o
try await app.autoMigrate()

Ambas opciones también exiten para revertir: --auto-revert y app.autoRevert().

Próximos Pasos

Echa un vistazo a las guías de schema builder y query builder para más información acerca de qué poner dentro de tus migraciones.