【发布时间】:2020-07-12 10:25:36
【问题描述】:
为了使用 pycouchdb 在 CouchDB 中的 RPI 上保存一些传感器数据,我创建了一个数据库模型类以具有清晰的结构而不是松散类型的字典
class SensorMeasure(NamedTuple):
temp: float
soilMoisture: float
dateTime: datetime
由于似乎无法自动序列化这个对象,所以我使用_asdict() method from NamedTuple 来获取一个dict对象,它可以存储在数据库中
server = pycouchdb.Server("http://127.0.0.1:5984/")
db = server.database(dbName)
measure = SensorMeasure(temp=sensor.getTemperature(), soilMoisture = sensor.getMoisture(), dateTime = datetime.now())
db.save(measure._asdict())
虽然这适用于浮点等原始类型,但它会在 datetime 上中断:
TypeError: Object of type datetime is not JSON serializable
看来我必须tell the serializer how he could generate a string from the datetime object,如果不修改pycouchdbs source code,这对我来说似乎是不可能的。
唯一可行的解决方法似乎是在SensorMeasure 模型中使用string 而不是datetime,并使用isoformat() 的datetime 方法。但这需要我
- install additional libraries for parsing
- 我必须在每次使用时解析它,并增加创建新对象的开销,指定格式,...
在设计方面,最好在类中有一个datetime 属性。我该如何存档?
其他解决方法
使用zip 函数似乎可以定义哪些键应该被序列化。这让我想到了删除 dateTime 字段,然后将其重新添加为字符串值,如下所示:
class SensorMeasure(NamedTuple):
temp:float
soilMoisture: float
dateTime: datetime
def test(self):
serializeFields = list(self._fields)
del serializeFields['dateTime']
serialized = OrderedDict(zip(serializeFields, self))
print(serialized)
serialized['dateTime'] = dateTime.isoformat()
print(serialized)
但这不起作用,因为返回的元组是不可变的。将其转换为列表应该允许写入,但是列表似乎只允许整数键:
TypeError: list indices must be integers or slices, not str
【问题讨论】:
标签: python json python-3.x datetime couchdb