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
})