Я использую Redis (phpredis) для обмена данными между моим Laravel и моим приложением Python.
В Laravel я сохраняю свой массив на определенном канале:
$data = MyModel::where('start_date','>', "2018-05-02 10:00:00")->get();
// $data = [{'id':1, 'start_date': "2018-05-03 12:00:00", 'name': "}…]
Redis::set("barChannel", json_encode($data));
В Python я прочитал эти данные:
import redis
import json
myredis = redis.Redis()
data = json.loads(myredis.get('barChannel'));
// data = [{'id':1, 'start_date': "2018-05-03 12:00:00", 'name': "}…]
Таким образом, в основном данные проходят успешно, но вместо того, чтобы напрямую указывать значение datetime в моем списке Python, у меня есть string, который мне нужно преобразовать. В приведенном выше примере я могу использовать datetime.datetime.strptime, но в случае более сложной структуры данных (вложенные списки dicts) ... преобразовывать каждую переменную довольно сложно.
Есть ли способ хранить дату в Redis, которая будет изначально распознаваться в Python?






Нет, после небольшого исследования вы бы узнали, что Redis хранит свои значения только в строковом представлении, поэтому ваш единственный вариант - сохранить сериализованные данные и десериализовать, когда это необходимо.
Начнем со следующего:
Обновленная информация о проблеме, с которой вы столкнулись выше. Два отличных сообщения об использовании модуля json решили мою проблему импорта глубоко вложенных дат времени из Redis (и их экспорта обратно):
Как преобразовать в объект datetime Python с помощью JSON.loads? (ИМПОРТ)
def date_hook(json_dict):
for (key, value) in json_dict.items():
try:
json_dict[key] = datetime.datetime.strptime(value, "%Y-%m-%d %H:%M:%S")
except:
pass
return json_dict
data = json.loads(myredis.get('barChannel'), object_hook=date_hook)
Как побороть "datetime.datetime not JSON serializable"? (ЭКСПОРТ)
def json_serial(obj):
"""JSON serializer for objects not serializable by default json code"""
if isinstance(obj, (datetime, date)):
return obj.strftime('%Y-%m-%d %H:%M:%S')
raise TypeError ("Type %s not serializable" % type(obj))
json_values = json.dumps(data, default=json_serial, separators=(',', ':'))
myredis.publish('barChannel', json_values);
Я читал об агностическом формате данных, но, поскольку у меня не было той же проблемы с целыми числами, мне было интересно.