在我的 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"
知道问题出在哪里吗?我将如何解决它? 谢谢你。
您面临的问题与查询中使用的数据类型有关。 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
。