本文讲解4.0版jxTMS中python服务的内置数据类,整个系列的文章请查看:docker版jxTMS使用指南:4.0版升级内容
docker版本的使用,请参考:docker版jxTMS使用指南
4.0版的jxTMS中python服务是一个采集前端数据的接口机。其自建了两类三种数据类:
通用的Device数据类,用于读取设备信息
通用的dsLog数据类,用于将某些日志记录到数据库中
vrs20类型的设备所采集到的设备数据,该表每日自动分表
前两者作为python服务的内置数据库,后者则定义在app/data_vrs20.py文件中。
三者都比较简单,只需做个简单的讲解。
其定义【属性等的定义,请参考data文件】是:
from jx.jxGo import jxGo
from jx.jxMysql import ORM
dbName = jxGo.getSysConfig('dbName')
class Device(ORM):
_allFunc = {}
_ormAttr = {
...
}
def __init__(self,data=None):
super(Device , self).__init__(dbName,'Device',data=data)
@classmethod
def newDataObj(cls,devType,devID):
#根据指定的设备类型来生成保存所采集到的设备数据的数据对象
dl = cls.__dict__['_allFunc']
f = dl.get(devType,None)
if f is None:
return None
return f(devID)
@classmethod
def register(cls,devType,func):
#注册不同设备类型的数据对象创建函数
dl = cls.__dict__['_allFunc']
dl[devType] = func
@classmethod
def getByName(cls,name):
#根据设备名从数据库中读取设备信息并创建相应的ORM对象
rs,rc = ORM.getBy(dbName,'Device','Name',name)
if rc and not rs is None:
return Device(data=rs)
return None
#将Device注册到ORM中,便于通过getBy等查询
ORM.register('Device',Device)
其定义【属性等的定义,请参考data文件;文件头部分同Device】是:
class dsLog(ORM):
_ormAttr = {
...
}
#本类没有主键
_key = []
#reset时不更新
_excludeReset = ['ObjType','ObjID']
def __init__(self, objType=None, objID=0):
super(dsLog , self).__init__(dbName,'dsLog')
#先设置本log对象是跟踪哪个设备、站点的
self.set(ObjType=objType,ObjID=objID)
def log(self, type, level, state, event, msg):
#先清除除_excludeReset外的其它属性
self.reset()
#设置相关属性
self.set(Type=type, Level=level, State=state, Event=event, Msg=msg)
#将日志信息写入数据库,reset相当于是新的日志了,所以当然是insert
#一方面,update会覆盖原来的信息,另一方面dsLog没有定义key,也是无法执行update的
self.insert()
ORM.register('dsLog',dsLog)
VRS20Data的定义可以在app/data_vrs20.py文件中看到,所以不复赘述。
其中:
def NewVRS20Data(devID):
ndo = VRS20Data()
ndo.set(DevID=devID)
return ndo
#注册保存vrs20类型的设备数据的函数
Device.register('vrs20',NewVRS20Data)
如此一来,当设备以自己的设备类型来调用:
self._ormData = Device.newDataObj(mytype, myid)
就生成了保存自己采集到的数据的数据对象。然后在需要保存时执行:
if self._newData:
self._ormData.reset()
#self._data中就是接收到前端设备发送过来的消息并解析后的dict
self._ormData.set(**self._data)
self._ormData.insert()
self._newData = False
参考资料:
jxTMS设计思想
jxTMS编程手册
下面的系列文章讲述了如何用jxTMS开发一个实用的业务功能:
如何用jxTMS开发一个功能
下面的系列文章讲述了jxTMS的一些基本开发能力:
jxTMS的HelloWorld