Amazon DynamoDB
开发人员指南 (API 版本 2012-08-10)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

步骤 4:查询和扫描数据

您可以使用 query 方法来检索表中的数据。您必须指定分区键值。排序键可选。

Movies 表的主键由以下部分组成:

  • year – 分区键。属性类型是数字。 

  • title – 排序键。属性类型是字符串。

要查找一年当中发行的所有电影,您只需指定 year。您还可以提供 title 以根据某种条件 (作用于排序键) 来检索电影子集;例如,查找 2014 年发行并且标题以字母“A”开头的电影。

query 外,还可使用 scan 方法检索所有表数据。

要了解有关查询和扫描数据的更多信息,请分别参阅使用查询使用扫描

步骤 4.1:查询 - 一年中发行的所有电影

此步骤中包含的程序将检索 year 1985 发行的所有电影。

  1. 将以下程序复制并粘贴到名为 MoviesQuery01.py 的文件中。

    from __future__ import print_function # Python 2/3 compatibility import boto3 import json import decimal from boto3.dynamodb.conditions import Key, Attr # Helper class to convert a DynamoDB item to JSON. class DecimalEncoder(json.JSONEncoder): def default(self, o): if isinstance(o, decimal.Decimal): if o % 1 > 0: return float(o) else: return int(o) return super(DecimalEncoder, self).default(o) dynamodb = boto3.resource('dynamodb', region_name='us-west-2', endpoint_url="http://localhost:8000") table = dynamodb.Table('Movies') print("Movies from 1985") response = table.query( KeyConditionExpression=Key('year').eq(1985) ) for i in response['Items']: print(i['year'], ":", i['title'])

    注意

    当您使用从 ConditionExpression 导入的 KeyAttr 函数时,Boto 3 开发工具包会为您构建一个 boto3.dynamodb.conditions。您还可以字符串形式指定 ConditionExpression

    有关 DynamoDB 的可用条件列表,请参阅 适用于 Python 的 AWS 软件开发工具包 (Boto3) 使用入门 中的 DynamoDB 条件

    有关更多信息,请参阅条件表达式

  2. 要运行该程序,请键入以下命令:

    python MoviesQuery01.py

注意

前面的程序演示了如何按主键属性对表进行查询。在 DynamoDB 中,您可以选择在表上创建一个或多个二级索引,并采用查询表的相同方法来查询这些索引。二级索引允许对非键属性进行查询,从而为您的应用程序带来额外的灵活性。有关更多信息,请参阅使用二级索引改进数据访问

步骤 4.2:查询 - 一年中发行的所有包含特定标题的电影

此步骤中包含的程序将检索 year 1992 发行并且 title 以字母“A”至字母“L”开头的所有电影。

  1. 将以下程序复制并粘贴到名为 MoviesQuery02.py 的文件中:

    from __future__ import print_function # Python 2/3 compatibility import boto3 import json import decimal from boto3.dynamodb.conditions import Key, Attr # Helper class to convert a DynamoDB item to JSON. class DecimalEncoder(json.JSONEncoder): def default(self, o): if isinstance(o, decimal.Decimal): return str(o) return super(DecimalEncoder, self).default(o) dynamodb = boto3.resource('dynamodb', region_name='us-west-2', endpoint_url="http://localhost:8000") table = dynamodb.Table('Movies') print("Movies from 1992 - titles A-L, with genres and lead actor") response = table.query( ProjectionExpression="#yr, title, info.genres, info.actors[0]", ExpressionAttributeNames={ "#yr": "year" }, # Expression Attribute Names for Projection Expression only. KeyConditionExpression=Key('year').eq(1992) & Key('title').between('A', 'L') ) for i in response[u'Items']: print(json.dumps(i, cls=DecimalEncoder))
  2. 要运行该程序,请键入以下命令:

    python MoviesQuery02.py

步骤 4.3:扫描

scan 方法将读取整个表中的所有项目,并返回表中的所有数据。您可提供一个可选的 filter_expression,以便仅返回符合条件的项目。但是,筛选条件仅在扫描整个表后应用。

以下程序将扫描整个 Movies 表,表中包含约 5000 个项目。扫描时可指定可选筛选条件,以便仅检索 20 世纪 50 年代以来的电影 (约 100 个项目),同时舍弃所有其他项目。

  1. 将以下程序复制并粘贴到名为 MoviesScan.py 的文件中:

    from __future__ import print_function # Python 2/3 compatibility import boto3 import json import decimal from boto3.dynamodb.conditions import Key, Attr # Helper class to convert a DynamoDB item to JSON. class DecimalEncoder(json.JSONEncoder): def default(self, o): if isinstance(o, decimal.Decimal): if o % 1 > 0: return float(o) else: return int(o) return super(DecimalEncoder, self).default(o) dynamodb = boto3.resource('dynamodb', region_name='us-west-2', endpoint_url="http://localhost:8000") table = dynamodb.Table('Movies') fe = Key('year').between(1950, 1959) pe = "#yr, title, info.rating" # Expression Attribute Names for Projection Expression only. ean = { "#yr": "year", } esk = None response = table.scan( FilterExpression=fe, ProjectionExpression=pe, ExpressionAttributeNames=ean ) for i in response['Items']: print(json.dumps(i, cls=DecimalEncoder)) while 'LastEvaluatedKey' in response: response = table.scan( ProjectionExpression=pe, FilterExpression=fe, ExpressionAttributeNames= ean, ExclusiveStartKey=response['LastEvaluatedKey'] ) for i in response['Items']: print(json.dumps(i, cls=DecimalEncoder))

    在代码中,请注意以下情况:

    • ProjectionExpression 用于指定要在扫描结果中包含的属性。

    • FilterExpression 用于指定一个条件,以便仅返回符合条件的项目。所有其他项目都将被舍弃。

    • scan 方法每次返回项目的一个子集 (称为页面)。响应中的 LastEvaluatedKey 值随后通过 scan 参数传递给 ExclusiveStartKey 方法。当返回最后一页后,LastEvaluatedKey 将不是响应的一部分。

    注意

    • ExpressionAttributeNames 提供名称替换功能。我们使用此参数是因为 year 是 DynamoDB 中的保留字 — 您不能直接在任何表达式中使用它,包括 KeyConditionExpression。您可使用表达式属性名称 #yr 来解决此问题。

    • ExpressionAttributeValues 提供值替换功能。使用此参数是因为您不能在任何表达式 (包括 KeyConditionExpression) 中使用文本。您可使用表达式属性值 :yyyy 来解决此问题。

  2. 要运行该程序,请键入以下命令:

    python MoviesScan.py

注意

您还可以对在表上创建的任意二级索引使用 Scan 操作。有关更多信息,请参阅使用二级索引改进数据访问