英文:
DynamoDB "The provided key element does not match the schema error"
问题
我已经在terraform中定义了dynamodb表格:
name = "component_table"
partition_key = "name"
partition_key_type = "S"
sort_key = "version"
billing_mode = "PAY_PER_REQUEST"
environment = "testing"
aws_region = "eu-west-1"
restore_to_latest_time = true
point_in_time_recovery = true
extra_attributes = [
{
name = "version"
type = "S"
},
{
name = "team"
type = "S"
}
]
local_secondary_index = [
{
name = "TeamSecondaryIndex"
projection_type = "ALL"
range_key = "team"
}
]
我使用aws操作符GetItem进行了查询,我将name定义为abc以进行测试,但似乎无法查询GetItem函数,因为它显示了以下错误:
提供的键元素与模式不匹配
我运行的函数如下:
func (m *Manager) ComponentGetByName(ctx context.Context, name string) (componentModel.Component, error) {
getItemInput := &awsDDB.GetItemInput{
TableName: &m.cfg.tableName,
Key: map[string]types.AttributeValue{
"name": &types.AttributeValueMemberS{
Value: name,
},
},
}
getItemOutput, err := m.Client.GetItem(ctx, getItemInput)
return getItemOutput
}
出于保密原因,我省略了将getItemOutput转换为组件模型的一些细节。我想知道为什么会出现这种情况,以及如何解决它?欢迎讨论。谢谢!
英文:
I've defined the dynamodb table in terraform here:
name = "component_table"
partition_key = "name"
partition_key_type = "S"
sort_key = "version"
billing_mode = "PAY_PER_REQUEST"
environment = "testing"
aws_region = "eu-west-1"
restore_to_latest_time = true
point_in_time_recovery = true
extra_attributes = [
{
name = "version"
type = "S"
},
{
name = "team"
type = "S"
}
]
local_secondary_index = [
{
name = "TeamSecondaryIndex"
projection_type = "ALL"
range_key = "team"
}
]
I've queried it with aws operator GetItem, I've defined name to be abc for testing purposes but can't seem to query a GetItem function as it says
The provided key element does not match the schema error
The function I ran is this:
func (m *Manager) ComponentGetByName(ctx context.Context, name string) (componentModel.Component, error) {
getItemInput := &awsDDB.GetItemInput{
TableName: &m.cfg.tableName,
Key: map[string]types.AttributeValue{
"name": &types.AttributeValueMemberS{
Value: name,
},
},
}
getItemOutput, err := m.Client.GetItem(ctx, getItemInput)
return getItemOutput
}
I've left some details out such as converting getItemOutput into a component model for secrecy. I'm wondering why this happens and how can I resolve it? Open for a discussion. Thanks!
答案1
得分: 2
问题是你正在尝试仅使用分区键值进行 GetItem 操作。要执行 GetItem 操作,你必须提供完整的主键,即分区键和排序键的值。在你的情况下,name
和 version
是必需的。
如果你只知道分区键,那么你必须执行 Query 操作。
你必须提供分区键属性的名称和该属性的单个值。Query 操作将返回具有该分区键值的所有项。
英文:
The issue is you are trying to do a GetItem using only the partition key value. To do a GetItem you must provide the full primary key which is Partition and sort key values. In your case name
and version
are required.
If you only know the Partition key, they you must perform Query operation.
You must provide the name of the partition key attribute and a single value for that attribute. Query returns all items with that partition key value
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论