Подтвердить что ты не робот

Можно ли сохранить datetime в 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: Неподдерживаемый тип "< type 'datetime.datetime' > " для значения "2015-01-12 05: 02: 57.053131"

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

Есть ли какое-либо решение?

4b9b3361

Ответ 1

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

enter image description here

Ответ 3

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

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

обновляется

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

Ответ 4

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

B Тип двоичных данных.

Тип: Blob

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

BOOL Булевский тип данных.

Тип: Boolean

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

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

Тип: массив Blobs

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

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

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

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

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

Тип: String к карте объектов AttributeValue

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

N Тип данных типа.

Тип: Строка

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

NS Тип данных набора данных.

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

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

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

Тип: Boolean

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

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

Тип: Строка

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

SS Тип данных набора строк.

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

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

Ответ 5

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

Просто протестировано и это рабочий пример:

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

Ответ 6

Если вы хотите использовать дату для поиска пользователей, вы можете просто вызвать функцию 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()
})
...

Ответ 7

Внимательно прочитав документацию, я нашел правильную ссылку на документацию здесь. Рекомендуемый способ хранения данных даты и времени в DynamoDB - это использование строк ISO 8601. поэтому тип данных является просто строкой.