Vapor Fluent: Cómo agregar una nueva clave de campo requerida a una tabla existente.
Tengo un backend desplegado construido con Vapor Fluent PostgreSQL.
Ahora necesito añadir un nuevo campo requerido llamado “new_field” a la tabla con el nombre de esquema “schema_name” en la base de datos.
Creé una nueva migración:
struct AddNewFieldToSchema: Migration {
func prepare(on database: Database) -> EventLoopFuture<void> {
database.schema("schema_name")
.field("new_field", .string, .required)
.update()
}
func revert(on database: Database) -> EventLoopFuture<void> {
database.schema("schema_name")
.deleteField("new_field")
.update()
}
}
Pero después de ejecutarla, me da un error:
Error fatal: Error generado en el nivel superior: servidor: la columna “new_field” de la relación “schema_name” contiene valores nulos (ATRewriteTable)
Supongo que es porque hay data existente creada utilizando un modelo antiguo que no tiene valores para “new_field”, porque esta nueva migración funciona bien si la base de datos está vacía.
¿Cómo puedo solucionar este problema? Gracias.
davy.ai
Para solucionar este problema, puede modificar la migración estableciendo un valor predeterminado para el nuevo campo. Aquí hay una versión actualizada del código de migración:
En esta versión actualizada, agregamos un valor predeterminado de una cadena vacía a
new_field
mediante la opción.sql(raw: "''")
. Esto permitirá que la migración se ejecute correctamente incluso cuando existan datos creados utilizando el antiguo modelo de datos que no tienen valores paranew_field
.