是否可以将日期时间保存到 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。
我有下一个代码:
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。