web-dev-qa-db-ja.com

日時をDynamoDBに保存することはできますか?

私は次のコードを持っています:

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では正常に動作します。

解決策はありますか?

33

さて、DynamoDBは日付型をサポートしていません。したがって、唯一の解決策は、Unixのような時刻を整数として使用するか、日付を文字列として保存することです。

enter image description here

30

ドキュメントによると: http://docs.aws.Amazon.com/amazondynamodb/latest/developerguide/JavaSDKHighLevel.html

日付S(文字列型)。日付値は、ISO-8601形式の文字列として保存されます。

11
Fred Campos

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"]
    }
)
8
user1855042

なぜdatetimeがDynamoDBでサポートされないのか、実際には経験もありません。

しかし、人々が提案したように日付時刻を文字列に変換しないことに固執している場合は、日付時刻をタイムスタンプに変換して、比較することができます。

更新しました

そして、あなたはこれを読みたいかもしれません SO Question 、数値比較が好ましい方法のように思われました。

2
Anzel

これらはすべて、DynamoDBの属性値でサポートされているタイプで、リストにある AWS Docs にあります。

[〜#〜] b [〜#〜]バイナリデータ型。

タイプ:ブロブ

必須:いいえ

[〜#〜] bool [〜#〜]ブールデータ型。

タイプ:ブール

必須:いいえ

[〜#〜] bs [〜#〜]バイナリセットのデータ型。

タイプ:BLOBの配列

必須:いいえ

[〜#〜] l [〜#〜]属性値のリスト。

タイプ:AttributeValueオブジェクトの配列

必須:いいえ

[〜#〜] m [〜#〜]属性値のマップ。

タイプ:文字列からAttributeValueオブジェクトマップ

必須:いいえ

[〜#〜] n [〜#〜]数値データ型。

タイプ:文字列

必須:いいえ

[〜#〜] ns [〜#〜]数値セットのデータ型。

タイプ:文字列の配列

必須:いいえ

[〜#〜] null [〜#〜]Nullデータ型。

タイプ:ブール

必須:いいえ

[〜#〜] s [〜#〜]文字列データ型。

タイプ:文字列

必須:いいえ

[〜#〜] ss [〜#〜]文字列セットのデータ型。

タイプ:文字列の配列

必須:いいえ

1
H6.

最近ドキュメントを読んで、ドキュメントへの正しいリンクを見つけました hereDynamoDBに日付と時刻のデータを保存する推奨方法は、ISO 8601文字列を使用することです。そのため、データ型は単なる文字列です。

1
alejo4373

日付を使用してユーザーを検索する場合は、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()
})
...
0
Stephen Lin