Tengo una tabla en la que es beneficioso generar un valor precalculado en el motor de la base de datos en lugar de en el código de mi aplicación. Para esto, estoy usando la función de columna generada de Postgres . El SQL es así:
ALTER TABLE "Items" ADD "generatedValue" DOUBLE PRECISION GENERATED ALWAYS AS ( LEAST("someCol", "someOtherCol") ) STORED;Esto funciona bien, pero estoy usando Sequelize con esta base de datos. Quiero encontrar una manera de definir esta columna en la definición de mi modelo, de modo que Sequelize la consulte, no intente actualizar el valor de una fila para esa columna e, idealmente, cree la columna sincronizada.
class Item extends Sequelize.Model { static init(sequelize) { return super.init({ someCol: Sequelize.DOUBLE, someOtherColl: Sequelize.DOUBLE, generatedValue: // <<<-- What goes here?? }); } }¿Cómo puedo hacer esto con Sequelize?
Puedo especificar la columna como DOBLE y Sequelize la leerá, pero la columna no se creará correctamente en la sincronización. ¿Quizás hay algún enlace posterior a la sincronización que pueda usar? Estaba considerando afterSync para eliminar la columna y volver a agregarla con mi declaración de valor generada, pero primero tendría que detectar que la columna aún no se había convertido o perdería mis datos. (Ejecuto sincronización [sin force: true ] en cada inicio de aplicación).
Cualquier pensamiento o idea alternativa sería apreciada.
Hasta que Sequelize admita campos de solo lectura y el tipo de datos GENERADO, puede moverse por Sequelize con un tipo de datos personalizado:
const Item = sequelize.define('Item', { someCol: { type: DataTypes.DOUBLE }, someOtherCol: { type: DataTypes.DOUBLE }, generatedValue: { type: 'DOUBLE PRECISION GENERATED ALWAYS AS (LEAST("someCol", "someOtherCol")) STORED', set() { throw new Error('generatedValue is read-only') }, }, }) Esto generará la columna correctamente en postgres al usar sync() , y evitará establecer el valor generatedValue en javascript arrojando un error.
Suponiendo que Sequelize nunca intente actualizar el campo si no ha cambiado, como se especifica en https://sequelize.org/master/manual/model-instances.html#change-awareness-of-save , entonces debería funcionar.