我有下一个代码:
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:不支持类型“<type'datetime.datetime'>”的值“2015-01-12 05:02:57.053131”
我尝试了很多方法,但似乎无法将datetime
保存到DynamoDB。顺便说一句,它在MongoDB中运行良好。
有什么解决方案吗?
好的,我看到DynamoDB不支持任何日期类型。所以唯一的解决方案是使用类似unix的时间作为整数,或将日期保存为字符串。
根据文件:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/JavaSDKHighLevel.html
日期S(字符串类型)。 Date值存储为ISO-8601格式的字符串。
根据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"]
}
)
我不确定为什么DynamoDB不支持datetime,或者事实上我也没有经验。
但是,如果您坚持不将日期时间转换为人们建议的字符串,则可以将日期时间转换为时间戳,以便与之进行比较。
你可能想读这个SO Question,似乎数字比较是首选方式。
这些是DynamoDB中列出的in their AWS Docs中属性值的所有受支持类型。
B二进制数据类型。
类型:Blob
要求:不
BOOL布尔数据类型。
类型:布尔值
要求:不
BS二进制集数据类型。
类型:Blob数组
要求:不
L属性值列表。
键入:AttributeValue对象的数组
要求:不
M属性值的映射。
Type:String to AttributeValue对象图
要求:不
N A数字数据类型。
类型:字符串
要求:不
NS A数字集数据类型。
类型:字符串数组
要求:不
NULL Null数据类型。
类型:布尔值
要求:不
S字符串数据类型。
类型:字符串
要求:不
SS A String Set数据类型。
类型:字符串数组
要求:不
最近阅读文档,我找到了文档here的正确链接。在DynamoDB中存储日期和时间数据的推荐方法是使用ISO 8601字符串。所以数据类型只是字符串。
如果要使用日期查找用户,可以直接调用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()
})
...