私は次のコードを持っています:
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
})
しかし、実行するとエラーが発生して失敗します。
TypeError:値「2015-01-12 05:02:57.053131」のサポートされていないタイプ「<type 'datetime.datetime'>」
私は多くの方法を試しましたが、datetime
をDynamoDBに保存することはできないようです。ちなみに、MongoDBでは正常に動作します。
解決策はありますか?
さて、DynamoDBは日付型をサポートしていません。したがって、唯一の解決策は、Unixのような時刻を整数として使用するか、日付を文字列として保存することです。
ドキュメントによると: http://docs.aws.Amazon.com/amazondynamodb/latest/developerguide/JavaSDKHighLevel.html
日付S(文字列型)。日付値は、ISO-8601形式の文字列として保存されます。
Alejandro-francoによれば response.isoformat()
トリックを作る。
テストしたばかりで、これは実際の例です:
CustomerPreferenceTable.put_item(
Item={
"id": str(uuid4()),
"validAfter": datetime.utcnow().isoformat(),
"validBefore": (datetime.utcnow() + timedelta(days=365)).isoformat(),
"tags": ["potato", "eggplant"]
}
)
なぜdatetimeがDynamoDBでサポートされないのか、実際には経験もありません。
しかし、人々が提案したように日付時刻を文字列に変換しないことに固執している場合は、日付時刻をタイムスタンプに変換して、比較することができます。
そして、あなたはこれを読みたいかもしれません SO Question 、数値比較が好ましい方法のように思われました。
これらはすべて、DynamoDBの属性値でサポートされているタイプで、リストにある AWS Docs にあります。
[〜#〜] b [〜#〜]バイナリデータ型。
タイプ:ブロブ
必須:いいえ
[〜#〜] bool [〜#〜]ブールデータ型。
タイプ:ブール
必須:いいえ
[〜#〜] bs [〜#〜]バイナリセットのデータ型。
タイプ:BLOBの配列
必須:いいえ
[〜#〜] l [〜#〜]属性値のリスト。
タイプ:AttributeValueオブジェクトの配列
必須:いいえ
[〜#〜] m [〜#〜]属性値のマップ。
タイプ:文字列からAttributeValueオブジェクトマップ
必須:いいえ
[〜#〜] n [〜#〜]数値データ型。
タイプ:文字列
必須:いいえ
[〜#〜] ns [〜#〜]数値セットのデータ型。
タイプ:文字列の配列
必須:いいえ
[〜#〜] null [〜#〜]Nullデータ型。
タイプ:ブール
必須:いいえ
[〜#〜] s [〜#〜]文字列データ型。
タイプ:文字列
必須:いいえ
[〜#〜] ss [〜#〜]文字列セットのデータ型。
タイプ:文字列の配列
必須:いいえ
最近ドキュメントを読んで、ドキュメントへの正しいリンクを見つけました here 。 DynamoDBに日付と時刻のデータを保存する推奨方法は、ISO 8601文字列を使用することです。そのため、データ型は単なる文字列です。
日付を使用してユーザーを検索する場合は、date()
関数を呼び出すだけです。このような:
...
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()
})
...