使用Azure Table Storage Node.js界面一次删除多个实体
我得到的唯一删除操作一次删除一个: 我想要的与SQL语句等效使用Azure Table Storage Node.js界面一次删除多个实体,node.js,rest,azure,azure-storage,azure-table-storage,Node.js,Rest,Azure,Azure Storage,Azure Table Storage,我得到的唯一删除操作一次删除一个: 我想要的与SQL语句等效 DELETE FROM MyTable WHERE PartitionKey = 'something' 该页面上还有一种发送批处理的方式(尽管我无法将其用于delete,有人知道为什么吗?)。但是,我首先必须进行选择,以获取要删除的实体列表,以便获取它们的行键。我想知道是否有可能只在一个Azure请求中完成这项工作 提前谢谢 更新:这是我试过的代码,但它不起作用。我已经确认调用函数时所有参数都是正确的 // subAccts al
DELETE FROM MyTable WHERE PartitionKey = 'something'
该页面上还有一种发送批处理的方式(尽管我无法将其用于delete,有人知道为什么吗?)。但是,我首先必须进行选择,以获取要删除的实体列表,以便获取它们的行键。我想知道是否有可能只在一个Azure请求中完成这项工作
提前谢谢
更新:这是我试过的代码,但它不起作用。我已经确认调用函数时所有参数都是正确的
// subAccts all have PartitionKey = pKey
function deleteAccount(pKey, rKey, subAccts, callback) {
var tasks = subAccts; // rename for readability
tasks.push({ PartitionKey: pKey, RowKey: rKey });
tableService.beginBatch();
async.forEach(tasks, function(task, callback) {
tableService.deleteEntity(myTable, task, function(error) {
if (!error) {
callback(null);
}
else {
console.log(error);
callback(error);
}
});
}, function(error) {
if (error) {
console.log(error);
callback(error);
return;
}
tableService.commitBatch(callback);
});
}
如果您事先不知道要删除的实体列表,则必须先查询以找到它们 <>你可以考虑重新调整你的表。如果不只是将这些实体放在同一个分区中,您可以将它们全部放在同一个表中(由它们自己),您可以删除该表。这通常用于删除旧日志。。。创建像log_-janur、log_-junur这样的表,然后只需一个命令就可以一次删除整个月份 编辑 库中似乎有一个bug。尝试此编辑作为解决方法:
BatchServiceClient.prototype.addOperation = function (webResource, outputData) {
if (azureutil.objectIsNull(outputData)) {
outputData = '';
}
if (webResource.httpVerb !== 'GET') {
webResource.headers[HeaderConstants.CONTENT_ID] = this.operations.length + 1;
if (webResource.httpVerb !== 'DELETE') {
webResource.headers[HeaderConstants.CONTENT_TYPE] = 'application/atom+xml;type=entry';
} else {
delete webResource.headers[HeaderConstants.CONTENT_TYPE];
}
...
我已经创建了一个拉请求来修复dev分支中的此问题:
在修复此问题之前,您始终可以克隆my fork()、签出
dev
分支和npm install
,而不是手动编辑代码。如果不知道要删除哪些实体,则无法删除实体。这并不意味着你必须先把它们拿来。你能解释一下你遇到的问题吗?我想以最有效的方式删除每个具有给定PartitionKey
的实体。好的,我先查询它们,现在我有了一个{PartitionKey,RowKey}
对象数组。使用这种方法,我在链接的页面上尝试了批处理方法,但没有成功。我将insertEntity
更改为deleteEntity
,但这是我唯一做的更改。他们的代码看起来错了吗?我可以确认为每个任务调用了deleteEntity
,并在最后调用了commitBatch
,但什么都没有发生。看起来一切正常。您是否捕获了HTTP流量(使用Fiddler或类似工具)以查看发生了什么?正在发送HTTP请求吗?响应是什么?嗯,我看到了导致调用上述代码的请求,并且我看到它正确地生成了204代码。但是,我没有看到我预期的commitBatch
会导致的对Azure的实际HTTP请求。然后我注意到,即使每次删除都执行单独的请求(这确实有效,但速度很慢),我仍然看不到任何对Azure的HTTP请求。对于deleteEntity
批处理,是否有其他(用户定义的)字段应该无关紧要,对吗?比如,如果我删除{PartitionKey:'p1',RowKey:'1',Desc:'foo'}
它应该还可以吗?我看不出有什么原因,但现在我已经绝望了,可以考虑任何事情。我想没关系,但是你可以检查代码。