用于查询 dynamodb 的 boto3 资源:查询条件缺少关键架构元素

Posted

技术标签:

【中文标题】用于查询 dynamodb 的 boto3 资源:查询条件缺少关键架构元素【英文标题】:boto3 resource for querying dynamodb : Query condition missed key schema element 【发布时间】:2020-08-03 13:59:13 【问题描述】:

我有一个表格:AdvgCountries,它有两列 一种。 CountryId(字符串)(分区键) 湾。 CountryName(String) 排序键 在创建表时,我只使用分区键创建,然后添加了一个全局二级索引,索引名称为:

CountryName-index
Type : GSI
Partition key : CountryId
Sort Key : CountryName

我可以根据CountryId 检索CountryName,但无法根据 CountryName 检索 CountryId。根据我的阅读,我发现可以通过提供 indexname 来执行此操作,但我收到以下错误:

botocore.exceptions.ClientError:发生错误 (ValidationException) 调用 Query 操作时:Query 条件缺少关键架构元素:CountryId

import boto3
import json
import os
from boto3.dynamodb.conditions import Key, Attr

def query_bycountryname(pCountryname, dynamodb=None):
    if not dynamodb:
        dynamodb = boto3.resource('dynamodb', endpoint_url="https://dynamodb.us-east-1.amazonaws.com")

    table = dynamodb.Table('AdvgCountires')
    print(f"table")
    attributes = table.query(
        IndexName="CountryName-index",
        KeyConditionExpression=Key('CountryName').eq(pCountryname),
    )
    if 'Items' in attributes and len(attributes['Items']) == 1:
        attributes = attributes['Items'][0]

    print(f"before return")
    return attributes

if __name__ == '__main__':


    CountryName = "India"
    print(f"Data for CountryName")
    countries = query_bycountryname(CountryName)
    for country in countries:
       print(country['CountryId'], ":", country['CountryName'])

感谢任何帮助。

【问题讨论】:

【参考方案1】:

您无法根据排序键获取主键值。 DynamoDB 不能这样工作。

在 Dynamodb 中,每个项目的位置由 它的分区键。

The Query operation in Amazon DynamoDB finds items based on primary key values.

KeyConditionExpression 用于编写条件语句 使用比较运算符对键进行评估并限制 退回的物品。换句话说,您可以使用特殊运算符来 按排序键值包含、排除和匹配项目

【讨论】:

以上是关于用于查询 dynamodb 的 boto3 资源:查询条件缺少关键架构元素的主要内容,如果未能解决你的问题,请参考以下文章

python--boto3 之 与dynamoDB 的基本交互,表的备份与恢复

json Boto3 DynamoDB更新响应

无法使用Lambda Python 3.6 Boto3在现有DynamoDB表中放置新项目[关闭]

使用带有全局二级索引的 boto3 在 dynamodb 上进行有条件的放置

Python Boto3 - 数据未正确写入DynamoDB

在DynamoDB python boto3中执行update_item时出错