docker版jxTMS使用指南:python服务之内置数据类

本文讲解4.0版jxTMS中python服务的内置数据类,整个系列的文章请查看:docker版jxTMS使用指南:4.0版升级内容

docker版本的使用,请参考:docker版jxTMS使用指南

4.0版的jxTMS中python服务是一个采集前端数据的接口机。其自建了两类三种数据类:

  • 通用的Device数据类,用于读取设备信息

  • 通用的dsLog数据类,用于将某些日志记录到数据库中

  • vrs20类型的设备所采集到的设备数据,该表每日自动分表

前两者作为python服务的内置数据库,后者则定义在app/data_vrs20.py文件中。

三者都比较简单,只需做个简单的讲解。

Device

其定义【属性等的定义,请参考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)
dsLog

其定义【属性等的定义,请参考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

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

你可能感兴趣的:(jxTMS,python,docker,SaaS,jxTMS)