¿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 ejecuto, falla con error:

TypeError: tipo no compatible “” para el 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?

Bien, veo que DynamoDB no admite ningún tipo de fecha. Por lo tanto, la única solución es usar el tiempo de Unix como entero o guardar la fecha como una cadena.

introduzca la descripción de la imagen aquí

De acuerdo a la documentación: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/JavaSDKHighLevel.html

Fecha S (tipo cadena). Los valores de fecha se almacenan como cadenas con formato ISO-8601.

De acuerdo con la respuesta de alejandro-franco .isoformat() 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"] } ) 

No estoy seguro de por qué datetime no es compatible con DynamoDB o, de hecho, tampoco tengo experiencia en ello.

Pero si se le insiste en que no convierta la fecha y hora en una cadena como lo sugiere la gente, puede convertir la fecha y hora en la fecha y hora, y así compararla.

actualizado

Y es posible que desee leer esta pregunta SO , que parece que la comparación numérica es la forma preferida.

Estos son todos los tipos admitidos para los valores de atributo en DynamoDB como se indica en sus documentos de AWS .

B A Tipo de datos binarios.

Tipo: Blob

Requerido: No

BOOL Un tipo de datos booleano.

Tipo: Booleano

Requerido: No

BS Un tipo de datos de conjunto binario.

Tipo: array de Blobs

Requerido: No

L A Lista de valores de atributos.

Tipo: matriz de objetos AttributeValue

Requerido: No

M A Mapa de valores de atributos.

Tipo: Cadena a mapa de objeto AttributeValue

Requerido: No

N Un tipo de datos numérico.

Tipo: String

Requerido: No

Tipo de datos de NS A Number Set.

Tipo: array de cuerdas

Requerido: No

NULL Un tipo de datos nulo.

Tipo: Booleano

Requerido: No

S Un tipo de datos de cadena.

Tipo: String

Requerido: No

Tipo de datos SS A String Set.

Tipo: array de cuerdas

Requerido: No

Al leer la documentación últimamente, encontré el enlace correcto a la documentación aquí . La forma recomendada para almacenar datos de fecha y hora en DynamoDB es mediante cadenas ISO 8601 . por lo que el tipo de datos es sólo una cadena.

Si desea usar date para encontrar 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() }) ...