2017-09-06 14 views
0

sequelizeを使用してトランザクション内でトランケートとバルク作成を実行しようとしています。ただし、bulkcreateは決して実行されません。これは、次のような私のコードは次のとおりです。トランザクション内でbulkCreateを続行する

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; 

を私は期待どおりに動作します作成し使用するように私は、機能を変更する場合は、次のようにこのため

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

ログがあります。

誰でも、bulkCreateが動作しない理由は何ですか?

答えて

0

上記が正しいことが分かります。問題は、コードの非同期性のために、次の反復の準備ができている配列を空にするクリーンアップ機能があることでした。この関数は、バルク作成の前に起動していたため、アイテム配列が空であるため作成が開始されませんでした。

解決策は以下のとおりです。

  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); 
      }); 
関連する問題