Redis: можно ли делиться датами напрямую между php / laravel и python?

Я использую 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?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
870
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Нет, после небольшого исследования вы бы узнали, что Redis хранит свои значения только в строковом представлении, поэтому ваш единственный вариант - сохранить сериализованные данные и десериализовать, когда это необходимо.

Начнем со следующего:

Я читал об агностическом формате данных, но, поскольку у меня не было той же проблемы с целыми числами, мне было интересно.

Sebastien D 02.05.2018 19:57

Обновленная информация о проблеме, с которой вы столкнулись выше. Два отличных сообщения об использовании модуля 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);

Другие вопросы по теме