web-dev-qa-db-fra.com

Est-il possible de sauvegarder la date/heure sur DynamoDB?

J'ai le code suivant:

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

Mais quand je le lance, il échoue avec une erreur:

TypeError: Type non pris en charge "<type 'datetime.datetime'>" pour la valeur "2015-01-12 05: 02: 57.053131"

J'ai essayé de nombreuses manières, mais il semble qu'il ne soit pas possible de sauvegarder datetime dans DynamoDB. Btw cela fonctionne très bien dans MongoDB.

Y-a-t'il une solution?

26
Alexander Perechnev

D'accord, je vois que DynamoDB ne prend en charge aucun type de date. La seule solution consiste donc à utiliser le temps de type Unix sous forme d’entier ou à enregistrer la date sous forme de chaîne.

enter image description here

25
Alexander Perechnev

Selon la documentation: http://docs.aws.Amazon.com/amazondynamodb/latest/developerguide/JavaSDKHighLevel.html

Date S (type de chaîne). Les valeurs de date sont stockées au format ISO-8601 des cordes.

8
Fred Campos

Selon alejandro-franco response.isoformat() faire l'affaire.

Vient de tester et cela un exemple de travail:

CustomerPreferenceTable.put_item(
    Item={
        "id": str(uuid4()),
        "validAfter": datetime.utcnow().isoformat(),
        "validBefore": (datetime.utcnow() + timedelta(days=365)).isoformat(),
        "tags": ["potato", "eggplant"]
    }
)
3
user1855042

Je ne sais pas pourquoi la date et l'heure ne sont pas prises en charge dans DynamoDB, ou en fait, je n'en ai aucune expérience.

Mais si vous insistez tellement pour ne pas convertir la date/heure en chaîne comme le suggèrent les personnes, vous pouvez convertir la date/heure en horodatage, afin de pouvoir la comparer.

mis à jour

Et vous voudrez peut-être lire ceci SO Question , semblait que la comparaison numérique était la méthode préférée. 

2
Anzel

Ce sont tous les types pris en charge pour les valeurs d'attribut dans DynamoDB telles que répertoriées dans leurs AWS Docs .

B Un type de données binaire.

Type: Blob

Obligatoire: non

BOOL Un type de données booléen.

Type: Booléen

Obligatoire: non

BS Un type de données d'ensemble binaire.

Type: tableau de blobs

Obligatoire: non

L Liste de valeurs d'attributs.

Type: tableau d'objets AttributeValue

Obligatoire: non

M Carte de valeurs d'attributs.

Type: Chaîne vers la mappe d'objets AttributeValue

Obligatoire: non

N Un type de données Number.

Type: chaîne

Obligatoire: non

NS Un type de données de jeu de nombres.

Type: tableau de chaînes

Obligatoire: non

NULL Un type de données Null.

Type: Booléen

Obligatoire: non

S Un type de données String.

Type: chaîne

Obligatoire: non

SS Un type de données String Set.

Type: tableau de chaînes

Obligatoire: non

1
H6.

En lisant la documentation récemment, j'ai trouvé le bon lien vers la documentation ici . La méthode recommandée pour stocker les données de date et d'heure dans DynamoDB consiste à utiliser des chaînes ISO 8601. le type de données est donc simplement une chaîne.

1
alejo4373

Si vous souhaitez utiliser la date pour rechercher des utilisateurs, vous pouvez simplement appeler la fonction date(). Comme ça:

...
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
Stephen Lin