是否可以将日期时间保存到DynamoDB?

问题描述 投票:28回答:7

我有下一个代码:

users_table = Table(users_table_name, connection=Core.aws_dynamodb_connection)
users_table.put_item(data={
  "login": login,
  "password": hashlib.sha256(password.encode("utf-8")).hexdigest(),
  "profile": profile,
  "registration_date": datetime.now() # PROBLEM IS HERE
})

但是当我运行它时,它失败并出现错误:

TypeError:不支持类型“<type'datetime.datetime'>”的值“2015-01-12 05:02:57.053131”

我尝试了很多方法,但似乎无法将datetime保存到DynamoDB。顺便说一句,它在MongoDB中运行良好。

有什么解决方案吗?

python datetime amazon-web-services amazon-dynamodb boto
7个回答
27
投票

好的,我看到DynamoDB不支持任何日期类型。所以唯一的解决方案是使用类似unix的时间作为整数,或将日期保存为字符串。


9
投票

根据文件:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/JavaSDKHighLevel.html

日期S(字符串类型)。 Date值存储为ISO-8601格式的字符串。


6
投票

根据alejandro-franco response .isoformat()的伎俩。

刚刚测试过这个例子:

CustomerPreferenceTable.put_item(
    Item={
        "id": str(uuid4()),
        "validAfter": datetime.utcnow().isoformat(),
        "validBefore": (datetime.utcnow() + timedelta(days=365)).isoformat(),
        "tags": ["potato", "eggplant"]
    }
)

2
投票

我不确定为什么DynamoDB不支持datetime,或者事实上我也没有经验。

但是,如果您坚持不将日期时间转换为人们建议的字符串,则可以将日期时间转换为时间戳,以便与之进行比较。

updated

你可能想读这个SO Question,似乎数字比较是首选方式。


1
投票

这些是DynamoDB中列出的in their AWS Docs中属性值的所有受支持类型。

B二进制数据类型。

类型:Blob

要求:不

BOOL布尔数据类型。

类型:布尔值

要求:不

BS二进制集数据类型。

类型:Blob数组

要求:不

L属性值列表。

键入:AttributeValue对象的数组

要求:不

M属性值的映射。

Type:String to AttributeValue对象图

要求:不

N A数字数据类型。

类型:字符串

要求:不

NS A数字集数据类型。

类型:字符串数组

要求:不

NULL Null数据类型。

类型:布尔值

要求:不

S字符串数据类型。

类型:字符串

要求:不

SS A String Set数据类型。

类型:字符串数组

要求:不


1
投票

最近阅读文档,我找到了文档here的正确链接。在DynamoDB中存储日期和时间数据的推荐方法是使用ISO 8601字符串。所以数据类型只是字符串。


0
投票

如果要使用日期查找用户,可以直接调用date()函数。像这样:

...
users_table = Table(users_table_name, connection=Core.aws_dynamodb_connection)
current = datetime.now()
users_table.put_item(data={
  "login": login,
  "password": hashlib.sha256(password.encode("utf-8")).hexdigest(),
  "profile": profile,
  # here use a different name for the entry
  "registration_time": current
  "registration_date": current.date()
})
...
© www.soinside.com 2019 - 2024. All rights reserved.