¿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?

Author: Alexander Perechnev, 2015-01-12

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.

introduzca la descripción de la imagen aquí

 24
Author: Alexander Perechnev,
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.

 8
Author: Fred Campos,
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.

 2
Author: Anzel,
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"]
    }
)
 2
Author: user1855042,
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

 1
Author: High6,
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.

 1
Author: Alejandro Franco,
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()
})
...
 0
Author: Stephen Lin,
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