example dynamodb python datetime amazon-web-services amazon-dynamodb boto

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() }) ...