Redis:是否可以直接在 php/laravel 和 python 之间共享日期时间?
Redis : is it possible to share datetimes directly between php/laravel and 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': "}…]
所以基本上数据成功通过,但我的 python 列表中没有直接有一个 datetime
值,我有一个必须转换的 string
。在上面的例子中,我可以使用 then datetime.datetime.strptime
但在更复杂的数据结构(嵌套的字典列表)的情况下......转换每个变量非常痛苦。
有没有一种方法可以在 Redis 中存储日期时间,Python 可以本地识别?
不,经过少量研究您会知道,Redis 仅以字符串表示形式存储其值,因此您唯一的选择是存储序列化数据并在需要时反序列化。
从以下内容开始:
- Unserialize PHP data in python
关于上述问题的更新。两篇关于使用 json
模块的优秀文章解决了我从 Redis 导入深度嵌套日期时间(并将它们导出回来)的问题:
How to convert to a Python datetime object with 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)
How to overcome "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);
我正在使用 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': "}…]
所以基本上数据成功通过,但我的 python 列表中没有直接有一个 datetime
值,我有一个必须转换的 string
。在上面的例子中,我可以使用 then datetime.datetime.strptime
但在更复杂的数据结构(嵌套的字典列表)的情况下......转换每个变量非常痛苦。
有没有一种方法可以在 Redis 中存储日期时间,Python 可以本地识别?
不,经过少量研究您会知道,Redis 仅以字符串表示形式存储其值,因此您唯一的选择是存储序列化数据并在需要时反序列化。
从以下内容开始:
- Unserialize PHP data in python
关于上述问题的更新。两篇关于使用 json
模块的优秀文章解决了我从 Redis 导入深度嵌套日期时间(并将它们导出回来)的问题:
How to convert to a Python datetime object with 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)
How to overcome "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);