¿Es posible guardar datetime en DynamoDB?
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 corro, falla con error:
TypeError: Tipo no soportado " " para valor "2015-01-12 05:02:57.053131"
He intentado muchas maneras, pero parece que no es posible guardar datetime
en DynamoDB. Por cierto, funciona bien en MongoDB.
¿hay alguna solución?
7 answers
Bien, veo que DynamoDB no admite ningún tipo de fecha. Así que la única solución es usar el tiempo tipo unix como entero, o guardar la fecha como cadena.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-12 02:31:47
Según la documentación: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/JavaSDKHighLevel.html
Fecha S (tipo de cadena). Los valores de fecha se almacenan con formato ISO-8601 cadena.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-11 18:43:48
No estoy seguro de por qué datetime no es compatible con DynamoDB, o de hecho tampoco tengo experiencia en él.
Pero si estás tan insistido en no convertir la fecha y hora a cadena como la gente sugirió, puedes convertir la fecha y hora a marca de tiempo, y así puedes comparar con ella.
Actualizado
Y es posible que desee leer esto ASÍ QUE la pregunta, parecía que la comparación numérica es la forma preferida.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:04
Según alejandro-franco respuesta .isoformat()
hacer 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"]
}
)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-04 19:16:45
Estos son todos los tipos admitidos para los valores de atributo en DynamoDB que se enumeran en sus documentos de AWS.
B Un tipo de datos Binario.
Tipo: Blob
Requerido: No
BOOL Un tipo de datos booleano.
Tipo: Booleano
Requerido: No
BS Un tipo de datos de conjunto binario.
Tipo: matriz de Blobs
Requerido: No
L Una Lista de atributo valor.
Tipo: matriz de objetos AttributeValue
Requerido: No
M Un mapa de valores de atributos.
Type: String to AttributeValue object map
Requerido: No
N Un tipo de dato numérico.
Tipo: Cadena
Requerido: No
NS Un tipo de datos de conjunto de números.
Tipo: matriz de cadenas
Requerido: No
NULL Un dato nulo tipo.
Tipo: Booleano
Requerido: No
S Un tipo de datos de Cadena.
Tipo: Cadena
Requerido: No
SS Un tipo de datos de conjunto de cadenas.
Tipo: matriz de cadenas
Requerido: No
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-12 12:59:46
Leyendo la documentación últimamente, he encontrado el enlace correcto a la documentación aquí. La forma recomendada de almacenar datos de fecha y hora en DynamoDB es usar cadenas ISO 8601. así que el tipo de datos es sólo cadena.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-29 03:41:52
Si desea utilizar la fecha para encontrar usuarios, simplemente puede invocar la función date()
. Así:
...
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()
})
...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-12 02:22:48