我获得的唯一删除操作一次删除一个:https://www.windowsazure.com/en-us/develop/nodejs/how-to-guides/table-services/#delete-entity
我想要的是等同于SQL语句
DELETE FROM MyTable WHERE PartitionKey = 'something'
同样在该页面上是一种发送批处理的方法(虽然我无法使用删除工具,但是有人知道为什么吗?)。但是,我首先要做一个select来获取我想要删除的实体列表以获得他们的RowKeys。我想知道是否可以在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);
});
}
答案 0 :(得分:0)
如果您不知道要提前删除的实体列表,则必须先查询才能找到它们。
但您可能会考虑重组您的表格。如果不是将这些实体放在同一个分区中,而是将它们全部放在同一个表中(单独使用),则可以删除该表。这通常用于删除旧日志...创建像log_january,log_february这样的表,然后您可以使用一个命令一次删除整个月。
修改强>
图书馆似乎有一个错误。尝试使用此编辑作为解决方法:
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分支中创建了一个拉取请求来修复它:https://github.com/WindowsAzure/azure-sdk-for-node/pull/300。
在修复此问题之前,您始终可以克隆我的分支(https://github.com/smarx/azure-sdk-for-node),签出dev
分支和npm install
,而不是手动编辑代码。