0

我得到的唯一删除操作一次删除一个:https ://www.windowsazure.com/en-us/develop/nodejs/how-to-guides/table-services/#delete-entity

我想要的相当于SQL语句

DELETE FROM MyTable WHERE PartitionKey = 'something'

该页面上还有一种发送批次的方法(尽管我无法使用删除,但有人知道为什么吗?)。但是,我首先必须进行选择以获取要删除的实体列表,以便获取它们的 RowKey。我想知道是否可以仅在对 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);
  });
}
4

1 回答 1

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];
        }
...

我在开发分支中创建了一个拉取请求来解决这个问题:https ://github.com/WindowsAzure/azure-sdk-for-node/pull/300 。

在解决此问题之前,您始终可以克隆我的 fork ( https://github.com/smarx/azure-sdk-for-node )、签出dev分支等等npm install,而不是手动编辑代码。

于 2012-08-03T05:17:01.090 回答