Ответ 1
Хорошо, я вижу, что DynamoDB не поддерживает типы дат. Таким образом, единственное решение - использовать unix-like time как integer или сохранить дату как строку.
У меня есть следующий код:
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.
Есть ли какое-либо решение?
Хорошо, я вижу, что DynamoDB не поддерживает типы дат. Таким образом, единственное решение - использовать unix-like time как integer или сохранить дату как строку.
Согласно документации: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/JavaSDKHighLevel.html
Дата S (тип строки). Значения даты хранятся в формате ISO-8601 строки.
Я не уверен, почему datetime не поддерживается в DynamoDB, или на самом деле у меня нет опыта в этом.
Но если вы так настаивали на том, чтобы не преобразовать дату и время в строку, как предполагалось, вы можете преобразовать дату и время в timestamp, и поэтому вы можете сравнить с ним.
И вы можете прочитать этот SO-вопрос, показалось, что предпочтительным является числовое сравнение.
Это все поддерживаемые типы значений атрибутов в DynamoDB, как указано в их Документах AWS.
B Тип двоичных данных.
Тип: Blob
Требуется: Нет
BOOL Булевский тип данных.
Тип: Boolean
Требуется: Нет
BS Тип данных двоичного набора.
Тип: массив Blobs
Требуется: Нет
L Список значений атрибутов.
Тип: массив объектов AttributeValue
Требуется: Нет
M Карта значений атрибутов.
Тип: String к карте объектов AttributeValue
Требуется: Нет
N Тип данных типа.
Тип: Строка
Требуется: Нет
NS Тип данных набора данных.
Тип: массив строк
Требуется: Нет
NULL Тип данных Null.
Тип: Boolean
Требуется: Нет
S Тип данных String.
Тип: Строка
Требуется: Нет
SS Тип данных набора строк.
Тип: массив строк
Требуется: Нет
Согласно alejandro-franco ответ .isoformat()
сделать трюк.
Просто протестировано и это рабочий пример:
CustomerPreferenceTable.put_item(
Item={
"id": str(uuid4()),
"validAfter": datetime.utcnow().isoformat(),
"validBefore": (datetime.utcnow() + timedelta(days=365)).isoformat(),
"tags": ["potato", "eggplant"]
}
)
Если вы хотите использовать дату для поиска пользователей, вы можете просто вызвать функцию 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()
})
...
Внимательно прочитав документацию, я нашел правильную ссылку на документацию здесь. Рекомендуемый способ хранения данных даты и времени в DynamoDB - это использование строк ISO 8601. поэтому тип данных является просто строкой.