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?
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.
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.
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"]
}
)
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.
Et vous voudrez peut-être lire ceci SO Question , semblait que la comparaison numérique était la méthode préférée.
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
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.
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()
})
...