Boto3 dynamoDB 查询日期范围

问题描述 投票:0回答:1

在我的 dynamoDB 表中,我有一个名为

last_updated
的列。该字段的格式示例为
2023-05-26 14:29:50

我想查询表中特定日期范围内的所有记录。例如,最近三天。为此,我有以下几点:

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('my_table')

now = datetime.now() # 2024-05-07 16:35:48.793364
three_days_ago = now - timedelta(days=3)  # 2024-05-04 16:35:48.793364

filter = Key('last_updated').between(three_days_ago, now); # <boto3.dynamodb.conditions.Between object at 0x000002ED71D3F560>

response = table.scan( FilterExpression=filter )
print(response)

我收到以下错误。我的猜测可能与数据格式有关?

TypeError: Unsupported type "<class 'datetime.datetime'>" for value "2024-05-04 16:35:48.793364"

知道问题出在哪里吗?我将如何解决它? 谢谢你。

python amazon-dynamodb boto3
1个回答
0
投票

您面临的问题与查询中使用的数据类型有关。 DynamoDB 需要查询中的值具有特定的数据类型,并且不直接支持您正在使用的

datetime
对象。要解决此问题,您可以将
datetime
对象转换为 DynamoDB 所需格式的字符串表示形式,即 ISO 8601 格式 (
YYYY-MM-DDTHH:MM:SS.sssZ
)。

以下是如何修改代码来实现此目的:

import boto3
from boto3.dynamodb.conditions import Key
from datetime import datetime, timedelta

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('my_table')

now = datetime.now()
three_days_ago = now - timedelta(days=3)

# Convert datetime objects to string in ISO 8601 format
now_str = now.isoformat()
three_days_ago_str = three_days_ago.isoformat()

# Use string representations in your filter expression
filter_expression = Key('last_updated').between(three_days_ago_str, now_str)

response = table.scan(FilterExpression=filter_expression)
print(response)

通过将

now
three_days_ago
转换为 ISO 8601 格式的字符串 (
YYYY-MM-DDTHH:MM:SS.sssZ
),您可以确保传递到 DynamoDB 的值采用预期格式,从而解决您遇到的
TypeError

© www.soinside.com 2019 - 2024. All rights reserved.