python-3.x 如何使用boto3从dynamodb中获取最后插入的项目?

iq0todco  于 2022-12-24  发布在  Python
关注(0)|答案(3)|浏览(199)

我有下面的项目在我的dynamodb

entry    timestamp                        status    key
ent1     Fri Dec 04 11:26:17 EST 2020     Success   101
ent2     Fri Dec 04 11:26:18 EST 2020     Failure   102
ent3     Fri Dec 04 11:26:19 EST 2020     Success   101

这里我只需要获取最后插入的状态= Success,即基于最新的时间戳-ent 3
预期数量

ent3     Fri Dec 04 11:26:19 EST 2020     Success   101

使用以下代码时,我没有看到结果返回

response=table.query(KeyConditionExpression= Key('key').eq('101'),
FilterExpression=Attr('status').eq('Success'))

那么如何从数据库中过滤/获取最后插入的项目呢?
谢谢

vbopmzt1

vbopmzt11#

您可以添加一个Global Secondary Index(GSI),将status作为分区关键字,将timestamp作为排序关键字,然后使用Limit=1查询该GSI以获取具有最新时间戳的项。如果需要最早的时间戳,请将ScanIndexForward=false添加到查询中。

gab6jxml

gab6jxml2#

尝试更新代码以遵循以下格式:

table.query(
  KeyConditionExpression='#a = :a',
  ExpressionAttributeValues={
    ':a': '101',
    ':b': 'Success'
  },
  ExpressionAttributeNames={
    '#a': 'key',
    '#b': 'status'
  },
  FilterExpression='#a = :a AND #b= :b'
)

我没有使用你在上面使用过的助手,因为它更容易,更动态地传递你的方程作为字符串参数。你也可以用一个更有意义的名字来替换'a',这样它更容易阅读。
编辑:我把两个例子混合在一起,所以这段代码可能不会像现在这样工作,但重点是给予一个例子,说明另一种实现目标的方法。

r1wp621o

r1wp621o3#

如果您需要特定分区中最后数据,如条目分区键中的ent3,您可以尝试类似的操作

response = dynamodb_client.query(TableName='TableName',
 KeyConditionExpression='#id =:id',
 ExpressionAttributeValues={
 ':id': {'S': 'ent3'}
 },
 ExpressionAttributeNames = {
 '#id':'entry'
 },
 Limit=1,ScanIndexForward=False)
 print(response['Items'])

相关问题