es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , ,

Answer

  1. Avatar for 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:

    struct AddNewFieldToSchema: Migration {
        func prepare(on database: Database) -> EventLoopFuture<void> {
            database.schema("schema_name")
                .field("new_field", .string, .required)
                .update()
    
            return database.schema("schema_name")
                .updateField("new_field", to: .string, .required, .sql(raw: "''"))
                .update()
        }
    
        func revert(on database: Database) -> EventLoopFuture<void> {
            database.schema("schema_name")
                .deleteField("new_field")
                .update()
        }
    }
    

    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 para new_field.

Comments are closed.