Azure 存储 table 逐行删除
Azure storage table delete row by row key
我正在尝试仅通过 rowkey 值从 azure 存储过滤器中删除行。
但是我没有看到删除操作有任何过载,我们只能使用 rowkey 进行过滤。对于具有特定 rowkey 的记录,是否有任何替代选项可以从 azure 存储 table 中删除行?
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;
}
}
行是指记录吗?
TableOperation.Delete 接受一个 Table 实体。看这里:https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.table.tableoperation.delete.aspx
要删除该实体,您必须首先通过指定其 Partition
键 and/or Row
键来检索它。
在此处查看 Table查询 class https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.table.tablequery_methods.aspx
检索后,将其传递给 Delete 方法。
没有方法
TableOperation.Delete(String rowKey)
、
唯一方法
public static TableOperation delete(final TableEntity entity)
在 TableOperation 中。详情见Get started with Azure Table storage using .NET
要删除实体,您需要 PartitionKey
和 RowKey
(Delete Entity REST API
)。所以你需要做的是首先获取匹配 RowKey
的实体。获取此实体后,您应该可以按照答案中所述调用 TableOperation.Delete
。
但是,不推荐 通过 RowKey
获取实体,因为它会执行完整 Table 扫描。如果您的 table 尺寸很小,这可能不是问题,但如果您的 table 包含大量实体,这将是一个问题。此外,RowKey
在 Partition
中是唯一的,即在 table 中只能有一个具有 PartitionKey
/RowKey
组合的实体。换句话说,您可以在不同的 Partitions
中拥有具有相同 RowKey
的实体。因此,当您仅通过 RowKey
获取实体时,您可能会返回多个实体。您需要确保删除的是正确的实体。
参考弗兰克斯的指点,我发布了答案,以便对面临类似问题的其他人有用。
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;
}
}
如果您的目标是 .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;
如果您知道 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;
}
}
mpl 是我的 table 行实体,需要从数据库中删除记录。
我添加了此答案以显示异步(带结果检查)
if (result)
{
//delete the lead from the storage table
TableOperation delRow = TableOperation.Delete(mpl);
TableResult tr = await table.ExecuteAsync(delRow);
if (((int)tr.HttpStatusCode) < 400)
log.LogInformation($"Table Record: {mpl.RowKey} deleted");
else
log.LogError($"Table Record: {mpl.RowKey} NOT deleted");
}
Windows.Azure.Storage
命名空间现已 弃用 取而代之的是 Azure.Data.Tables
命名空间。因此,TableOperation.Delete
方法 也已弃用 。您现在应该使用 TableClient
and it's DeleteEntity
方法:
TableClient tableClient = new TableClient(connectionString, Table);
tableClient.DeleteEntity(PartitionKey, RowKey);
如果您也愿意,还有异步版本DeleteEntityAsync
。
我正在尝试仅通过 rowkey 值从 azure 存储过滤器中删除行。 但是我没有看到删除操作有任何过载,我们只能使用 rowkey 进行过滤。对于具有特定 rowkey 的记录,是否有任何替代选项可以从 azure 存储 table 中删除行?
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;
}
}
行是指记录吗?
TableOperation.Delete 接受一个 Table 实体。看这里:https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.table.tableoperation.delete.aspx
要删除该实体,您必须首先通过指定其 Partition
键 and/or Row
键来检索它。
在此处查看 Table查询 class https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.table.tablequery_methods.aspx
检索后,将其传递给 Delete 方法。
没有方法
TableOperation.Delete(String rowKey)
、
唯一方法
public static TableOperation delete(final TableEntity entity)
在 TableOperation 中。详情见Get started with Azure Table storage using .NET
要删除实体,您需要 PartitionKey
和 RowKey
(Delete Entity REST API
)。所以你需要做的是首先获取匹配 RowKey
的实体。获取此实体后,您应该可以按照答案中所述调用 TableOperation.Delete
。
但是,不推荐 通过 RowKey
获取实体,因为它会执行完整 Table 扫描。如果您的 table 尺寸很小,这可能不是问题,但如果您的 table 包含大量实体,这将是一个问题。此外,RowKey
在 Partition
中是唯一的,即在 table 中只能有一个具有 PartitionKey
/RowKey
组合的实体。换句话说,您可以在不同的 Partitions
中拥有具有相同 RowKey
的实体。因此,当您仅通过 RowKey
获取实体时,您可能会返回多个实体。您需要确保删除的是正确的实体。
参考弗兰克斯的指点,我发布了答案,以便对面临类似问题的其他人有用。
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;
}
}
如果您的目标是 .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;
如果您知道 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;
}
}
mpl 是我的 table 行实体,需要从数据库中删除记录。 我添加了此答案以显示异步(带结果检查)
if (result)
{
//delete the lead from the storage table
TableOperation delRow = TableOperation.Delete(mpl);
TableResult tr = await table.ExecuteAsync(delRow);
if (((int)tr.HttpStatusCode) < 400)
log.LogInformation($"Table Record: {mpl.RowKey} deleted");
else
log.LogError($"Table Record: {mpl.RowKey} NOT deleted");
}
Windows.Azure.Storage
命名空间现已 弃用 取而代之的是 Azure.Data.Tables
命名空间。因此,TableOperation.Delete
方法 也已弃用 。您现在应该使用 TableClient
and it's DeleteEntity
方法:
TableClient tableClient = new TableClient(connectionString, Table);
tableClient.DeleteEntity(PartitionKey, RowKey);
如果您也愿意,还有异步版本DeleteEntityAsync
。