使用Azure Table Storage Node.js接口一次删除多个实体

时间:2012-08-02 23:18:56

标签: node.js rest azure azure-storage azure-table-storage

我获得的唯一删除操作一次删除一个: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);
  });
}

1 个答案:

答案 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,而不是手动编辑代码。