python - example - ¿Es posible guardar la fecha y hora en DynamoDB?
boto3 dynamodb example (7)
De acuerdo con la documentación: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/JavaSDKHighLevel.html
Fecha S (tipo de cadena). Los valores de Fecha se almacenan como cadenas con formato ISO-8601.
Tengo el siguiente código:
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
})
Pero cuando lo ejecuto, falla con un error:
TypeError: Tipo no soportado "<tipo ''datetime.datetime''>" for value "2015-01-12 05: 02: 57.053131"
Lo he intentado de muchas maneras, pero parece que no es posible guardar la datetime
y datetime
en DynamoDB. Por cierto, funciona bien en MongoDB.
¿Hay alguna solución?
De acuerdo, veo que DynamoDB no admite ningún tipo de fecha. Entonces, la única solución es usar tiempo unix como un entero, o guardar la fecha como una cadena.
Estos son todos los tipos admitidos para valores de atributo en DynamoDB como se enumeran en sus AWS Docs .
B Un tipo de datos binarios.
Tipo: Blob
Requerido: No
BOOL Un tipo de datos booleanos.
Tipo: booleano
Requerido: No
BS A Binary Set type type.
Tipo: matriz de Blobs
Requerido: No
L A Lista de valores de atributo.
Tipo: matriz de objetos AttributeValue
Requerido: No
M A Mapa de los valores de los atributos.
Tipo: String to AttributeValue object map
Requerido: No
N Un tipo de datos numéricos.
Tipo: Cadena
Requerido: No
NS A Number Set type type.
Tipo: matriz de cadenas
Requerido: No
NULL A Tipo de datos nulo.
Tipo: booleano
Requerido: No
S Un tipo de datos de cadena.
Tipo: Cadena
Requerido: No
SS A String Set type type.
Tipo: matriz de cadenas
Requerido: No
Leyendo la documentación últimamente, encontré el enlace correcto a la documentación here . La forma recomendada de almacenar datos de fecha y hora en DynamoDB es usar cadenas ISO 8601 . entonces el tipo de datos es solo una cadena.
No estoy seguro de por qué datetime no es compatible con DynamoDB, o de hecho tampoco tengo experiencia en él.
Pero si se le insiste en no convertir la fecha y hora en cadena como lo sugirieron las personas, puede convertir la fecha y hora en la fecha y hora, y así poder compararla.
actualizado
Y es posible que desee leer esta pregunta SO , parecía que la comparación numérica es la forma preferida.
Según alejandro-franco, la response .isoformat()
hace el truco.
Acabo de probar y este es un ejemplo de trabajo:
CustomerPreferenceTable.put_item(
Item={
"id": str(uuid4()),
"validAfter": datetime.utcnow().isoformat(),
"validBefore": (datetime.utcnow() + timedelta(days=365)).isoformat(),
"tags": ["potato", "eggplant"]
}
)
Si desea usar la fecha para buscar usuarios, simplemente puede invocar la función date()
. Me gusta esto:
...
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()
})
...