C# 为什么我的表创建在尝试重新创建已删除的DynamoDB表时失败?
我在DynamoDB有一张简单的桌子 名称:测试 主分区键:ID 我已经读到,高效清空DynamoDB表的方法是删除该表,然后重新创建它 所以,我写了这个:C# 为什么我的表创建在尝试重新创建已删除的DynamoDB表时失败?,c#,amazon-dynamodb,C#,Amazon Dynamodb,我在DynamoDB有一张简单的桌子 名称:测试 主分区键:ID 我已经读到,高效清空DynamoDB表的方法是删除该表,然后重新创建它 所以,我写了这个: public bool DeleteAllRecords() { DeleteTableRequest deleteTableRequest = new DeleteTableRequest { TableName = "TEST" }; TableDescription tableDescr
public bool DeleteAllRecords()
{
DeleteTableRequest deleteTableRequest = new DeleteTableRequest
{
TableName = "TEST"
};
TableDescription tableDescription = _dynamoDbClient.DeleteTable(deleteTableRequest).TableDescription;
CreateTableRequest createTableRequest = new CreateTableRequest
{
TableName = tableDescription.TableName,
AttributeDefinitions = tableDescription.AttributeDefinitions,
KeySchema = tableDescription.KeySchema,
ProvisionedThroughput = new ProvisionedThroughput
{
ReadCapacityUnits = tableDescription.ProvisionedThroughput.ReadCapacityUnits,
WriteCapacityUnits = tableDescription.ProvisionedThroughput.WriteCapacityUnits
}
};
CreateTableResponse response = _dynamoDbClient.CreateTable(createTableRequest);
return true;
}
当我运行上面的程序时,我得到了这个异常
检测到2个验证错误:“keySchema”处的值null未能满足约束:成员不能为null;“attributeDefinitions”处的值null未能满足约束:成员不能为null
tableDescription中返回的keySchema和attributeDefinitions的值是空列表。
如果表中没有这些值,则从何处/如何获取这些值;记住,它们可能在某一点上具有价值 你需要先做一个
可描述的。这将返回您要查找的值。deletetetetable
操作中的响应主要用于提供TableStatus
值
请记住,删除操作不是即时的,因此您需要在创建新表之前检查表的状态。如果表仍在删除,您将无法创建新表。鉴于大多数AWS操作的异步性质,以下流程将是正确的:
- 以捕获现有表的详细信息
- (异步)
在deletetetable请求之后,指定的表处于删除状态,直到DynamoDB完成删除。如果表处于活动状态,则可以将其删除。如果一个表处于创建或更新状态,那么DynamoDB将返回ResourceInUseException。如果指定的表不存在,DynamoDB将返回ResourceNotFoundException。如果表已处于删除状态,则不会返回任何错误
- 同样,直到
ResourceNotFoundException
- (异步)
收到CreateTable请求后,DynamoDB立即返回一个响应,其中表状态为CREATING。创建表后,DynamoDB将表状态设置为ACTIVE。只能对活动表执行读写操作
[…]您可以使用可描述的操作来检查表状态
- 直到直到
TableStatus==“活动”
所有引用都来自本文中包含的链接检测到“仍在删除”或等待“被删除”不应该是涵盖删除操作的正常锁定/事务的一部分吗?不确定“正常锁定/事务”是什么意思我只知道对DeleteTable
的调用在表实际删除之前返回。“我只知道对DeleteTable的调用在表实际删除之前返回。”这是一个非常不幸的设计决策,也是一个很好的建议。从正常的DML语句中,我有点希望在尝试新的操作之前正确完成上一个操作。确保旧表至少在数据库中的“table of Tables”之外听起来应该是安全的。DynamoDB与“普通”数据库有很大的不同,像“table of Tables”这样的大多数概念实际上并不适用于它。在任务完成之前,异步API调用返回是“正常的”。