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.