it-swarm.com.ru

Можно ли сохранить дату и время в 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
})

Но когда я запускаю его, он завершается ошибкой:

Ошибка типа: неподдерживаемый тип "<тип 'datetime.datetime'>" для значения "2015-01-12 05: 02: 57.053131"

Я пробовал много способов, но кажется, что невозможно сохранить datetime в DynamoDB. Кстати, он прекрасно работает в MongoDB.

Есть ли решение?

26
Alexander Perechnev

Хорошо, я вижу, что DynamoDB не поддерживает какие-либо типы дат. Таким образом, единственным решением является использование Unix-подобного времени в качестве целого числа или сохранение даты в виде строки.

enter image description here

25
Alexander Perechnev

Согласно документации: http://docs.aws.Amazon.com/amazondynamodb/latest/developerguide/JavaSDKHighLevel.html

Дата S (тип строки). Значения даты хранятся в формате ISO-8601 строки.

8
Fred Campos

Согласно alejandro-franco ответ.isoformat() сделать свое дело.

Только что проверил и это рабочий пример:

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

Я не уверен, почему datetime не поддерживается в DynamoDB, или фактически у меня нет никакого опыта в этом.

Но если вы так настаиваете на том, чтобы не преобразовывать дату и время в строку, как предлагали люди, вы можете преобразовать дату и время в метку времени, чтобы вы могли сравнить ее.

обновленный

И вы можете прочитать этот вопрос SO Вопрос , казалось, что числовое сравнение является предпочтительным способом. 

2
Anzel

Это все поддерживаемые типы значений атрибутов в DynamoDB, перечисленные в их документах AWS .

B A Двоичный тип данных.

Тип: Blob

Требуется: нет

BOOL Логический тип данных.

Тип: логическое значение

Требуется: нет

BS Тип данных двоичного набора.

Тип: массив BLOB-объектов

Требуется: нет

L Список значений атрибутов.

Тип: массив объектов AttributeValue

Требуется: нет

M Карта значений атрибутов.

Тип: String to AttributeValue объектная карта

Требуется: нет

N A Тип данных Number.

Тип: Строка

Требуется: нет

NS A Number Установить тип данных.

Тип: массив строк

Требуется: нет

NULL Тип данных Null.

Тип: логическое значение

Требуется: нет

S Тип данных String.

Тип: Строка

Требуется: нет

SS Строковый тип данных.

Тип: массив строк

Требуется: нет

1
H6.

Читая документацию в последнее время, я нашел правильную ссылку на документацию здесь . Рекомендуемый способ хранения данных даты и времени в DynamoDB - использование строк 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