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

Is it possible to save datetime to DynamoDB?

我有下一个代码:

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: Unsupported type "< type 'datetime.datetime' >" for value "2015-01-12 05:02:57.053131"

我试了很多方法,但似乎无法将 datetime 保存到 DynamoDB。顺便说一句,它在 MongoDB.

中工作正常

有什么解决办法吗?

如果要使用日期查找用户,只需调用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-like 时间作为整数,或者将日期保存为字符串。

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

但是如果你坚持不按照人们建议的那样将日期时间转换为字符串,你可以将日期时间转换为时间戳,这样你就可以与之进行比较。

已更新

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

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

B A Binary data type.

Type: Blob

Required: No

BOOL A Boolean data type.

Type: Boolean

Required: No

BS A Binary Set data type.

Type: array of Blobs

Required: No

L A List of attribute values.

Type: array of AttributeValue objects

Required: No

M A Map of attribute values.

Type: String to AttributeValue object map

Required: No

N A Number data type.

Type: String

Required: No

NS A Number Set data type.

Type: array of Strings

Required: No

NULL A Null data type.

Type: Boolean

Required: No

S A String data type.

Type: String

Required: No

SS A String Set data type.

Type: array of Strings

Required: No

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

Date S (string type). The Date values are stored as ISO-8601 formatted strings.

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

根据 alejandro-franco .isoformat() 的说法。

刚刚测试,这是一个有效的例子:

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

旧 post 但也许仍然很有趣..

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

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

我的输出

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

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