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.

Cómo usar filas eliminadas suavemente en masa Crear sequelize

Tengo 2 tablas en mysql llamadas Serviceability y ServiceabilityLive, la primera tabla es actualizada por el equipo de operaciones y la segunda tabla es actualizada mediante un cron en un momento determinado.

Estoy utilizando el siguiente código para actualizar lo mismo en la tabla en vivo, pero no está funcionando.

const serviceablities = await Serviceability.findAll({
    where: {
      lab_id: lab.id
    },
    paranoid: false
  }).then(serviceablities => {
    return serviceablities.map(serviceablity => serviceablity.dataValues)
  })
await ServiceabilityLive.bulkCreate(serviceablities, { updateOnDuplicate: ["id"]})

Pero esto no está actualizando la fila que tiene el valor deletedAt no nulo en la tabla Serviceability, aunque no está siendo actualizada en la tabla ServiceabilityLive.

¿Podría por favor ayudarme y hacerme saber qué es lo que estoy omitiendo?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el código proporcionado solo obtiene los datos de prestación de servicios de la tabla de Prestación de Servicios y trata de actualizarlos en la tabla en vivo de Prestación de Servicios utilizando bulkCreate con la opción updateOnDuplicate establecida en “id”.

    Sin embargo, bulkCreate solo actualizará las filas que ya existen en la tabla en vivo de Prestación de Servicios, no aquellas que hayan sido eliminadas de la tabla de Prestación de Servicios, como indica deletedAt no siendo nulo.

    Una forma de abordar este problema es actualizar manualmente las filas eliminadas antes de llamar a bulkCreate. Puedes usar una combinación del método update de Sequelize y bulkCreate para lograr esto. Aquí tienes un ejemplo:

    const deletedIds = await Serviceability.destroy({
      where: {
        lab_id: lab.id,
        deletedAt: {
          [Op.not]: null
        }
      }
    }).then(deletedCount => {
      // obtener los ids de las filas eliminadas
      return ServiceabilityLive.findAll({
        attributes: ['id'],
        where: {
          lab_id: lab.id,
          id: {
            [Op.in]: Sequelize.literal(`(${deletedCount})`)
          }
        }
      }).then(rows => rows.map(row => row.id))
    });
    
    const serviceabilities = await Serviceability.findAll({
      where: {
        lab_id: lab.id
      },
      paranoid: false
    }).then(serviceabilities => {
      return serviceabilities.map(serviceability => serviceability.dataValues)
    });
    
    await ServiceabilityLive.bulkCreate(serviceabilities, {
      updateOnDuplicate: ["id"]
    });
    
    // actualizar manualmente las filas eliminadas
    if (deletedIds.length > 0) {
      await ServiceabilityLive.update({
        deletedAt: new Date()
      }, {
        where: {
          id: {
            [Op.in]: deletedIds
          }
        }
      });
    }
    

    En este código, primero usamos el método destroy para obtener el recuento de las filas eliminadas en la tabla de Prestación de Servicios. Luego, usamos el método literal de Sequelize para construir una subconsulta que selecciona solo los ids de las filas eliminadas de la tabla en vivo de Prestación de Servicios.

    A continuación, recuperamos todas las filas no eliminadas de la tabla de Prestación de Servicios y utilizamos bulkCreate para actualizar la tabla en vivo de Prestación de Servicios. Finalmente, actualizamos manualmente las filas eliminadas en la tabla en vivo de Prestación de Servicios estableciendo su campo deletedAt con la fecha actual.

Comments are closed.