我试图仅通过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;
}
}
答案 0 :(得分:8)
要删除实体,您需要PartitionKey
和RowKey
(Delete 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)
答案 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;
}
}