# 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. ```swift // Una migración de ejemplo. struct MyMigration: Migration { func prepare(on database: any Database) -> EventLoopFuture { // Haz un cambio en la base de datos. } func revert(on database: any Database) -> EventLoopFuture { // Deshaz el cambio hecho en `prepare`, si es posible. } } ``` Si estás usando `async`/`await` deberías implementar el protocolo `AsyncMigration`: ```swift struct MyMigration: AsyncMigration { func prepare(on database: any Database) async throws { // Haz un cambio en la base de datos. } func revert(on database: any 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`. ```swift 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. ```swift 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`. ```sh swift run App migrate ``` También puedes ejecutar este [comando desde Xcode](../advanced/commands.md#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`. ```sh 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`. ```sh swift run App serve --auto-migrate ``` También puedes hacerlo de manera programática. ```swift 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](schema.md) y [query builder](query.md) para más información acerca de qué poner dentro de tus migraciones.