是否可以将日期时间保存到 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?的主要内容,如果未能解决你的问题,请参考以下文章