我尝试使用sequelize在事务中执行截断和批量创建。但是,批量创建永远不会执行。我的代码如下:
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);
});
此日志如下:
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;
如果我更改了函数以便我使用create,它将按预期工作。
任何想法为什么bulkCreate都没有工作?
答案 0 :(得分:0)
原来以上是正确的。问题是由于代码的异步性质,我有一个清理函数,它会清空数组,为下一次迭代做好准备。此函数在bulkcreate之前触发,因此当items数组为空时,create不会触发。
更新后的解决方案如下。
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);
});