web-dev-qa-db-fra.com

Nodejs séquestre en masse upsert

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.

13
Ashutosh

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.

20
followtest52

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.

1
Can

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.

0
blankstar85