webentwicklung-frage-antwort-db.com.de

Kann man datetime in DynamoDB speichern?

Ich habe den nächsten Code:

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

Aber wenn ich es starte, schlägt es fehl mit dem Fehler:

TypeError: Nicht unterstützter Typ "<Typ 'datetime.datetime'>" für Wert "2015-01-12 05: 02: 57.053131"

Ich habe viele Möglichkeiten ausprobiert, aber es scheint nicht möglich zu sein, datetime in DynamoDB zu speichern. Übrigens funktioniert es gut in MongoDB.

Gibt es eine Lösung?

26

Okay, ich sehe, dass DynamoDB keine Datumstypen unterstützt. Daher ist die einzige Lösung die Verwendung einer unixartigen Zeit als Ganzzahl oder das Speichern des Datums als Zeichenfolge.

enter image description here

25

Laut Dokumentation: http://docs.aws.Amazon.com/amazondynamodb/latest/developerguide/JavaSDKHighLevel.html

Datum S (String-Typ). Die Datumswerte werden im ISO-8601-Format gespeichert Streicher.

8
Fred Campos

Laut Alejandro-Franco Response.isoformat() machen den Trick.

Gerade getestet und dies ein funktionierendes Beispiel:

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

Ich bin mir nicht sicher, warum datetime in DynamoDB nicht unterstützt wird, oder ich habe auch keine Erfahrung damit.

Wenn Sie jedoch darauf bestehen, die datetime nicht in eine Zeichenfolge umzuwandeln, wie dies von den Leuten vorgeschlagen wurde, können Sie die datetime in eine Zeitmarke konvertieren und damit vergleichen.

aktualisierte

Vielleicht möchten Sie diese SO - Frage lesen , schien numerischer Vergleich der bevorzugte Weg. 

2
Anzel

Dies sind alle unterstützten Typen für Attributwerte in DynamoDB, wie aufgeführt in ihren AWS-Dokumenten .

[~ # ~] b [~ # ~] Ein binärer Datentyp.

Typ: Klecks

Erforderlich: Nein

[~ # ~] bool [~ # ~] Ein boolescher Datentyp.

Typ: Boolean

Erforderlich: Nein

[~ # ~] bs [~ # ~] Ein Binärsatz-Datentyp.

Typ: Array von Blobs

Erforderlich: Nein

[~ # ~] l [~ # ~] Eine Liste von Attributwerten.

Typ: Array von AttributeValue-Objekten

Erforderlich: Nein

[~ # ~] m [~ # ~] Eine Zuordnung von Attributwerten.

Typ: String zur AttributeValue-Objektzuordnung

Erforderlich: Nein

[~ # ~] n [~ # ~] Ein Zahlendatentyp.

Typ: Zeichenfolge

Erforderlich: Nein

[~ # ~] ns [~ # ~] Ein Zahlensatz-Datentyp.

Typ: Array von Strings

Erforderlich: Nein

[~ # ~] null [~ # ~] Ein Null-Datentyp.

Typ: Boolean

Erforderlich: Nein

[~ # ~] s [~ # ~] Ein String-Datentyp.

Typ: Zeichenfolge

Erforderlich: Nein

[~ # ~] ss [~ # ~] Ein String-Set-Datentyp.

Typ: Array von Strings

Erforderlich: Nein

1
H6.

Beim letzten Lesen der Dokumentation fand ich den richtigen Link zur Dokumentation hier . Die empfohlene Methode zum Speichern von Datums- und Zeitdaten in DynamoDB ist die Verwendung von ISO 8601 -Strings. Der Datentyp ist also nur eine Zeichenfolge.

1
alejo4373

Wenn Sie Datum zum Suchen von Benutzern verwenden möchten, können Sie einfach die Funktion date() aufrufen. So was:

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