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

时间:2015-01-12 02:06:49

标签: python datetime amazon-web-services amazon-dynamodb boto

我有下一个代码:

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:不支持的类型"<输入' datetime.datetime' >" for value" 2015-01-12 05:02:57.053131"

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

有没有解决方案?

8 个答案:

答案 0 :(得分:27)

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

enter image description here

答案 1 :(得分:9)

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

  

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

答案 2 :(得分: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"]
    }
)

答案 3 :(得分:2)

我不确定为什么在DynamoDB中不支持datetime,或者实际上我也没有使用它。

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

更新

您可能想要阅读此SO Question,似乎数字比较是首选方式。

答案 4 :(得分:1)

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

  

B 二进制数据类型。

     

输入:Blob

     

必填:否

     

BOOL 布尔数据类型。

     

类型:布尔值

     

必填:否

     

BS 二进制集数据类型。

     

键入:Blob数组

     

必填:否

     

L 属性值列表。

     

类型:AttributeValue对象数组

     

必填:否

     

M 属性值的地图。

     

类型:String to AttributeValue对象图

     

必填:否

     

N 数字数据类型。

     

类型:字符串

     

必填:否

     

NS 数字集数据类型。

     

键入:字符串数组

     

必填:否

     

NULL Null数据类型。

     

类型:布尔值

     

必填:否

     

S 字符串数据类型。

     

类型:字符串

     

必填:否

     

SS 字符串集数据类型。

     

键入:字符串数组

     

必填:否

答案 5 :(得分:1)

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

答案 6 :(得分: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()
})
...

答案 7 :(得分:0)

旧帖子,但也许仍然很有趣..

您可以做什么以及它如何为我服务:

import datetime
from datetime import datetime

...

now = datetime.now()
x = now.strftime("%m/%d/%Y, %H:%M:%S")

 table.put_item(
           Item={
               'Index': Index,
           
               'Stamp': x,
               
            }
        )

并适应上面的代码:

import datetime
from datetime import datetime

...

now = datetime.now()
x = now.strftime("%m/%d/%Y, %H:%M:%S")

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": x, 
})   

我的输出

You can see the format in the DB