【问题标题】:How to get the last inserted item from dynamodb using boto3?如何使用 boto3 从 dynamodb 获取最后插入的项目?
【发布时间】:2021-04-25 14:27:41
【问题描述】:

我的 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 ,即基于最新的时间戳 - ent3

#预期

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

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

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

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

谢谢

【问题讨论】:

  • 哪些属性是你的主键?您是否使用排序键和分区键?从问题中看不出来。 key 属性似乎是一个不错的候选者,但在您的示例中并不是唯一的
  • 另外,你说你没有看到结果返回。你有什么回报吗?

标签: python-3.x amazon-web-services amazon-dynamodb boto3


【解决方案1】:

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

【讨论】:

  • 好主意,但请记住,添加 GSI 会立即增加额外成本。当您添加 GSI 时,幕后发生的事情是您的表被复制了。新表与原始表保持同步,唯一的区别是新表的分区键是 GSI。示例:table1 PK 是 key table2(隐藏表) PK 是状态。
  • @Mickers 是的,虽然这取决于索引中的projected 属性,但是,是的,最好澄清二级索引有额外的成本。这里有一个权衡与扫描整个表来过滤你想要的项目,这既慢又消耗 WCU。
【解决方案2】:

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

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

我没有使用您在上面使用的帮助程序,因为将您的方程式作为字符串参数传递更容易、更动态。您还可以将“a”替换为更有意义的名称,以便于阅读。

编辑:我将两个示例混合在一起,因此此代码可能无法按原样运行,但重点是提供另一种实现目标的示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多