Y a-t-il un moyen de faire de gros upsert en sequelize. Aussi, puis-je spécifier les clés à utiliser pour vérifier les doublons?
J'ai essayé de suivre mais je n'ai pas travaillé:
Employee.bulkCreate(data, {
updateOnDuplicate: true
});
La création en bloc fonctionne bien cependant. L'instruction ci-dessus crée toujours de nouvelles entrées dans la base de données.
De la référence officielle sequelizejs .
Cela peut être fait en utilisant bulkCreate
avec l'option updateOnDuplicate
.
Comme ceci par exemple:
Employee.bulkCreate(dataArray,
{
fields:["id", "name", "address"] ,
updateOnDuplicate: ["name"]
} )
updateOnDuplicate
est un tableau de champs qui seront mis à jour lorsque la clé primaire (ou une clé unique) correspond à la ligne. Assurez-vous que vous avez au moins un champ unique (disons id) dans votre modèle et dans la variable dataArray
pour l'upsert.
Puisque PostgreSQL n'est pas pris en charge par la réponse, l'option "" "" meilleure "" "" utilisant Sequelize effectue une requête manuelle avec l'instruction ON CONFLICT
. Exemple (TypeScript):
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 })
Cela créerait une requête comme celle-ci:
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;
Autant dire que ce n’est pas la solution idéale pour avoir à construire manuellement des requêtes, car elle empêche l’utilisation de sequelize, mais si c’est une requête unique dont vous n’avez pas désespérément besoin, vous pouvez utiliser cette méthode.
Je ne peux pas commenter alors ajoutant une réponse. Pour Mysql, Mariadb, vous pouvez utiliser les éléments suivants:
Model.bulkCreate(dataArray, {updateOnDuplicate: []});
en utilisant ce qui précède, il sera inséré s'il est nouveau ou met à jour tous les champs s'il s'agit d'un doublon Pas besoin de déclarer les champs si vous voulez tout mettre à jour.