Python 是否可以将datetime保存到DynamoDB?

Python 是否可以将datetime保存到DynamoDB?,python,datetime,amazon-web-services,amazon-dynamodb,boto,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": dat

我有下一个代码:

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中运行良好


有什么解决方案吗?

如果您想使用date查找用户,只需调用
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()
})
...

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


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

但是,如果您坚持不按照人们的建议将datetime转换为字符串,您可以将datetime转换为时间戳,这样您就可以与它进行比较

更新
你可能想读这篇文章,似乎数字比较是首选的方式

这些都是DynamoDB中支持的属性值类型,如下所示

B一种二进制数据类型

类型:水滴

必填项:否

BOOL布尔数据类型

类型:布尔型

必填项:否

BS二进制集数据类型

类型:BLOB数组

必填项:否

L属性值列表

类型:AttributeValue对象数组

必填项:否

M属性值的映射

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

必填项:否

N数字数据类型

类型:字符串

必填项:否

NS数字集数据类型

类型:字符串数组

必填项:否

NULL空数据类型

类型:布尔型

必填项:否

S字符串数据类型

类型:字符串

必填项:否

SS字符串集数据类型

类型:字符串数组

必填项:否


根据文件:

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


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

根据alejandro franco
的说法。isoformat()
成功

刚刚测试过,这是一个工作示例:

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

这是一篇老文章,但可能仍然很有趣

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

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, 
})   
我的输出


为什么要投否决票?我已经花了大约3个小时来查找任何示例,阅读了大量文档,但没有看到关于我的问题的任何信息。可能将类型从datetime.datetime更改为string,然后将其存储到DB?@m170897017,不,这不是一个解决方案,因为我需要按注册日期范围查找用户。另请参见:不,这并不能决定问题。它抛出错误,因为它不接受标准的python日期对象。我对我的问题进行了编辑,以使其更清楚。哈哈,所以这个问题实际上是datetime不受支持:)是的,我认为将它们转换为字符串是一种方法,你应该接受自己的答案,这样其他人就会知道为什么和他们在相同情况下有什么解决方案。@Alex Krzyżanowski我同意Anzel。你应该承认你的答案是正确的。如果看到另一个答案被标记为正确,则会产生误导。可以使用字符串和数字数据类型。存储ISO8601格式时为字符串,存储历元时间时为数字。更多信息请点击此处:谢谢您的回复。我不确定在将日期存储为字符串的情况下是否可以按范围查询对象。所以时间戳是唯一的解决方案。感谢AmazonAhaha:).JSON没有指定日期时间应该如何表示。DynamoDB已经开始支持JSON字段类型。另一个将datetimes存储为普通的基于历元的时间戳的好理由是,这是生存时间的基础。你在哪里看到的?你能更新你的答案吗?如果链接不存在:写下你没有看到它anymore@FredCampos链接再次存在!您应该编辑您的答案:)这仅适用于Java。不适用于python。请注意datetime.utcnow()不会返回带有时区信息的日期。因此,在回解析时,您应该知道存储的信息是UTC。我不会使用datetime.utcnow().replace(tzinfo=timezone.utc).isoformat(),而是使用datetime.fromisoformat()轻松解析生成的信息。