2017-09-06 8 views
0

J'essaie d'exécuter une création tronquée et en masse au sein d'une transaction à l'aide de sequelize. Cependant, le bulkcreate n'est jamais exécuté. Mon code est la suivante:Sequelize bulkCreate dans une transaction

  sequelize.transaction(function(t) { 
       return Item.destroy({ truncate: true, transaction: t }).then(() => { 
        return Item.bulkCreate(itemsArray, {transaction: t}) 
       }) 
      }).catch(function (err) { 
       logger.error('ERROR:' + err); 
      }); 

Les journaux en sont les suivantes:

5:21:23 PM - info: Successfully connected to DB:XXX 
Executing (default): CREATE TABLE IF NOT EXISTS `items` (`barcode` 
VARCHAR(255) NOT NULL , `base` INTEGER, `original` INTEGER, `sale` INTEGER, 
`extraSale` INTEGER, `date` DATETIME, PRIMARY KEY (`barcode`)) ENGINE=InnoDB; 
Executing (default): SHOW INDEX FROM `items` 
Executing (83dc186e-dec7-4814-94fd-f05cebc0e48b): START TRANSACTION; 
Executing (83dc186e-dec7-4814-94fd-f05cebc0e48b): TRUNCATE `items` 
5:21:02 PM - info: here 
Executing (83dc186e-dec7-4814-94fd-f05cebc0e48b): COMMIT; 

Si je change la fonction pour que je l'utilise de créer cela fonctionne comme prévu.

Quelqu'un a des idées pourquoi bulkCreate ne fonctionne pas?

Répondre

0

Il s'avère que ce qui précède est correct. Le problème était qu'en raison de la nature asynchrone du code j'avais une fonction de nettoyage qui viderait le tableau prêt pour l'itération suivante. Cette fonction tirait avant le bulkcreate et donc la création ne s'est pas déclenchée car le tableau d'items était vide.

La solution mise à jour est ci-dessous.

  sequelize.transaction(function(t) { 
       return Item.destroy({ truncate: true, transaction: t }).then(() => { 
        return Item.bulkCreate(itemsArray, { transaction: t }).then(() => { 
         //Ensure we are cleaned-up ready for the next iteration 
         //Have to clean up here due to async callback 
         itemsArray = []; 
        }, err => { 
         logger.error('ERROR:' + err); 
        }) 
       }, err => { 
        logger.error('ERROR:' + err); 
       }) 
      }).catch(function (err) { 
       logger.error('ERROR:' + err); 
      });