Saltar al contenido

Nodejs secuela el upsert masivo

Solución:

De la referencia oficial de sequelizejs.

Se puede hacer usando bulkCreate con el updateOnDuplicate opción.

Así por ejemplo:

Employee.bulkCreate(dataArray, 
    {
        fields:["id", "name", "address"] ,
        updateOnDuplicate: ["name"] 
    } )

updateOnDuplicate es una matriz de campos que se actualizará cuando la clave principal (o puede ser una clave única) coincida con la fila. Asegúrese de tener al menos un campo único (digamos id) en su modelo y en el dataArray ambos para upsert.

Actualizar

Sequelize 6.x agregó soporte para todos los UPSERT en todos los dialectos, por lo que la respuesta de @ followtest52 también es válida para PostgreSQL.

Original

Dado que PostgreSQL no es compatible con la respuesta, la “” “” mejor “” “” alternativa al usar Sequelize es hacer una consulta manual con el ON CONFLICT declaración. Ejemplo (mecanografiado):

const values: Array<Array<number | string>> = [
    [1, 'Apple', 'Red', 'Yummy'],
    [2, 'Kiwi', 'Green', 'Yuck'],
]

const query = 'INSERT INTO fruits (id, name, color, flavor) VALUES ' +
     values.map(_ => { return '(?)' }).join(',') +
     ' ON CONFLICT (id) DO UPDATE SET flavor = excluded.flavor;'

sequelize.query({ query, values }, { type: sequelize.QueryTypes.INSERT })

Esto generaría una consulta como:

INSERT INTO 
    fruits (id, name, color, flavor)
VALUES 
    (1, 'Apple', 'Red', 'Yummy'),
    (2, 'Kiwi', 'Green', 'Yuck')
ON CONFLICT (id) DO UPDATE SET 
    flavor = excluded.flavor;

Basta decir que esta no es una solución ideal para tener que crear consultas manualmente, ya que frustra el propósito de usar la secuenciación, pero si se trata de una consulta única que no necesita desesperadamente, puede usar este método.

Actualización 2019

Funciona para todos los dialectos siempre que coincida con una cierta versión mínima

AQUÍ está la referencia al código fuente del mismo

  • Tenga en cuenta que las opciones individuales pueden o no funcionar en todos los dialectos. Por ejemplo, updateOnDuplicate funcionará solo en MySQL, MariaDB, SQLite y Postgres.

  • La opción ignoreDuplicates NO funcionará en MSSQL

También verifique este BLOQUE de código en la fuente

if (Array.isArray(options.updateOnDuplicate) && options.updateOnDuplicate.length) {
    options.updateOnDuplicate = _.intersection(
        _.without(Object.keys(model.tableAttributes), createdAtAttr),
        options.updateOnDuplicate
    );
} else {
    return Promise.reject(new Error('updateOnDuplicate option only supports non-empty array.'));
}

updateOnDuplicate tiene que ser una matriz, no puede ser verdadero o falso

Entonces, siguiendo los puntos anteriores, su código debería ser algo como esto

Employee.bulkCreate(data, {
    updateOnDuplicate: ['employeeName', 'employeeAge'],
});

ACTUALIZAR:

Como alguien mencionó que no funciona, intente esto

models.Employee.bulkCreate(items, {
    returning: ['employeeId'],
    ignoreDuplicates: true
  })
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *