Azure存储表逐行删除

时间:2016-05-13 03:58:43

标签: c# azure azure-table-storage cloud-storage

我试图仅通过rowkey值从azure存储过滤器中删除行。 但我没有看到删除操作的任何重载,我们只能用rowkey过滤。是否有其他选项可以从azure存储表中删除具有特定rowkey的记录的行?

RemoveEntityByRowKey('123456');
public static void RemoveEntityByRowKey(string myRowKey)
        {
            try
            {
                CloudTable table = _tableClient.GetTableReference("MyAzureTable"); 
                       TableOperation delteOperation = TableOperation.Delete(myRowKey);
                table.Execute(delteOperation);
            }
            catch (Exception ex)
            {
                LogError.LogErrorToAzure(ex);
                throw;
            }
        }

6 个答案:

答案 0 :(得分:8)

要删除实体,您需要PartitionKeyRowKeyDelete Entity REST API)。所以你需要做的是首先获取匹配RowKey的实体。获取此实体后,您应该能够按照答案中的说明调用TableOperation.Delete

但是,不推荐RowKey提取实体,因为它会执行全表扫描。如果您的表大小很小,这可能不是问题,但是当您的表包含大量实体时会出现问题。此外,RowKey中的Partition是唯一的,即在表格中,只有一个实体具有PartitionKey / RowKey组合。换句话说,您可能在不同的RowKey中拥有具有相同Partitions的实体。因此,当您仅通过RowKey获取实体时,您可能会获得多个实体。您需要确保删除正确的实体。

答案 1 :(得分:4)

按行,你的意思是记录吗?

TableOperation.Delete接受表实体。见这里:https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.table.tableoperation.delete.aspx

要删除该实体,您必须先通过指定其class Terms(UserMixin, BaseModel): term_id = CharField() sets_id = CharField() term_count = IntegerField() term = TextField() definition = TextField() @classmethod def include_term(cls, set_id, term_id, definition, rank, term, **kwards): try: cls.select().where(cls.term_id == term_id).get() except cls.DoesNotExist: print("putting term into db") concept = cls( set_id = set_id, term_id = term_id, term= term, definition = definition, rank = rank ) concept.save() print(concept.term) print("term saved to db") return concept else: raise Exception("Term with that id already exists") 密钥和/或Partition密钥来检索它。

在这里查看TableQuery类https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.table.tablequery_methods.aspx

检索后,将其传递给Delete方法。

答案 2 :(得分:2)

没有方法

<img>

只有方法

TableOperation.Delete(String rowKey)

TableOperation中的

。有关详细信息,请参阅issue

答案 3 :(得分:2)

如果目标是.NET Core,则需要使用ExecuteQuerySegmentedAsync方法来执行过滤条件查询。 ExecuteQuery已过时。

var cloudTableClient = _cloudStorageAccount.CreateCloudTableClient();
var myTable = cloudTableClient.GetTableReference("MyTable");
var query = new TableQuery<MyEntity>().Where(TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, "myRowKey"));
var segment = await myTable.ExecuteQuerySegmentedAsync(query, null);
var myEntities = segment.Results;

答案 4 :(得分:1)

如果您知道PartitionKey和RowKey,则无需检索整个实体即可将其删除。您可以按照以下方式修改代码:

public static void RemoveEntityByRowKey(string myRowKey)
{
    try
    {
        var entity = new YourEntity 
        {
            PartitionKey = "partition",
            RowKey = myRowKey,
            ETag = "*"
        }

        CloudTable table = _tableClient.GetTableReference("MyAzureTable"); 
        TableOperation delteOperation = TableOperation.Delete(entity);
        table.Execute(delteOperation);
    }
    catch (Exception ex)
    {
        LogError.LogErrorToAzure(ex);
        throw;
    }
}    

答案 5 :(得分:0)

参考Franks指针,我发布了答案,以便对面临类似问题的其他人有用。

RemoveEntityByRowKey('123456');
public static void RemoveEntityByRowKey(string myRowKey)
        {
            try
            {
                CloudTable table = _tableClient.GetTableReference("MyAzureTable"); 

   TableQuery<myEntity> query = new TableQuery<myEntity>()
                   .Where(TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, myRowKey));

                foreach (var item in table.ExecuteQuery(query))
                {
                    var oper = TableOperation.Delete(item);
                    table.Execute(oper);                    
                } 
            }
            catch (Exception ex)
            {
                LogErrorToAzure(ex);
                throw;
            }
        }