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

Posted

技术标签:

【中文标题】是否可以将日期时间保存到 DynamoDB?【英文标题】:Is it possible to save datetime to DynamoDB? 【发布时间】:2015-03-09 18:30:12 【问题描述】:

我有下一个代码:

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:值“2015-01-12 05:02:57.053131”的不支持类型“”

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

有什么解决办法吗?

【问题讨论】:

为什么要投反对票?我已经花了大约 3 个小时来查找任何示例,阅读了大量文档,但没有看到任何关于我的问题的信息。 也许将类型从 datetime.datetime 更改为字符串,然后将其存储到 DB? @m170897017,不,这不是解决方案,因为我需要按注册日期范围查找用户。 另见:What data type should be use for timestamp in DynamoDB? 【参考方案1】:

如果要使用日期查找用户,只需调用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()
)
...

【讨论】:

不,它不能决定问题。它会抛出错误,因为它不接受标准的 python 日期对象。我已经编辑了我的问题以使其更清楚。【参考方案2】:

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

【讨论】:

哈哈,所以问题真的是 datetime 不支持 :) 是的,我认为将它们转换为 String 是要走的路 你应该接受你自己的答案,这样其他人就会知道为什么以及他们在相同情况下有什么解决方案。 @Alex Krzyżanowski 我同意安泽尔的观点。您应该接受您的答案作为正确答案。看到另一个答案被标记为正确是一种误导。 可以使用字符串和数字数据类型。存储 ISO8601 格式时为 String,存储 Epoch 时间时为 Number。更多信息:abhayachauhan.com/2017/12/…【参考方案3】:

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

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

更新

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

【讨论】:

感谢您的回复。我不确定是否可以将日期存储为字符串以按范围查询对象。所以时间戳是唯一的解决方案。感谢亚马逊啊哈哈 :)。 JSON 没有指定日期时间的表示方式。 DynamoDB 已开始支持 JSON 字段类型。 将日期时间存储为正常的基于纪元的时间戳的另一个很好的理由是,这就是生存时间的基础。 docs.aws.amazon.com/amazondynamodb/latest/developerguide/…【参考方案4】:

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

B二进制数据类型。

类型:Blob

必填:否

BOOL布尔数据类型。

类型:布尔值

必填:否

BS二进制集数据类型。

类型:Blob 数组

必填:否

L属性值列表。

类型:AttributeValue 对象数组

必填:否

M属性值映射。

类型:字符串到 AttributeValue 对象映射

必填:否

N数字数据类型。

类型:字符串

必填:否

NS数字集数据类型。

类型:字符串数组

必填:否

NULL Null 数据类型。

类型:布尔值

必填:否

S 字符串数据类型。

类型:字符串

必填:否

SS String Set 数据类型。

类型:字符串数组

必填:否

【讨论】:

【参考方案5】:

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

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

【讨论】:

你在哪里看到的? 你能更新你的答案吗?如果链接不存在:写下你不再看到它 @FredCampos 链接又存在了!你应该编辑你的答案:) 这仅适用于 Java。不适用于 python。【参考方案6】:

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

【讨论】:

【参考方案7】:

根据 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"]
    
)

【讨论】:

请注意 datetime.utcnow() 不会返回带有时区信息的日期。因此,在解析时,您应该知道存储的信息是 UTC。我不会使用 datetime.utcnow().replace(tzinfo=timezone.utc).isoformat(),而是使用 datetime.fromisoformat() 轻松解析生成的信息。【参考方案8】:

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

你能做什么以及它对我有什么作用:

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, 
)   

我的输出

【讨论】:

【参考方案9】:

使用 DDB2,现在似乎支持 Instant。

https://github.com/aws/aws-sdk-java-v2/tree/master/services-custom/dynamodb-enhanced#changing-update-behavior-of-attributes

【讨论】:

以上是关于是否可以将日期时间保存到 DynamoDB?的主要内容,如果未能解决你的问题,请参考以下文章

DynamoDB 最高效的日期类型

DynamoDb 查询存储日期

使用名称中的当前日期和时间将图像保存到 sd 不起作用

DynamoDB中时间戳的数据类型[重复]

如何将日期和时间保存到特定按钮?

将数据框中的日期时间保存为 csv 时保持时区