docker版jxTMS使用指南:数据查询

本文讲解4.2版jxTMS新增的强大的数据查询能力,整个系列的文章请查看:docker版jxTMS使用指南:4.2版升级内容

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

4.0版jxTMS的说明,请查看:4.0版升级内容

在之前的【访问数据库】一文中,我们介绍了jxTMS的python服务是如何访问mysql数据库。但其中的查询能力还是比较弱的,所以4.2版jxTMS新增了一个强大的查询类:query。

引用:

from jx.jxMysql import query

query的强大不仅仅在于其可以简单的实现多表联合、添加查询条件等,其还支持分表查询,不需要知道数据应在哪个分表中,只要定义好查询条件,query会自动定位到相应的分表来读取数据。

使用query的步骤为:

1、创建query对象:

s = query(dbname,limit=15)

query在创建时应指定数据库名,如果需调整一次查询的结果数量,可通过limit来设置。

2、如果其中有的表是分表的话,设置分表信息:

s.setRename('PCS',renameType='day')

setRename对象函数说明:

setRename(self, renameTalbeName, renameType = ‘day’, renameJudgeByField = ‘CreateTime’, renameDec = False)

参数:
	renameTalbeName:会分表的表名
	renameType:分表的周期,默认每天分表
	renameJudgeByField:该表根据哪个时间字段来判断数据所处分表
	renameDec:分表查询是否按renameJudgeByField的降序来排序,默认renameDec,即按时间先后的升序来读取结果

注:只能指定一个分表

3、query默认就是多表联合查询,所以需要指定要查询哪些表的哪些列,并应给出表别名

s.addTable('PCS',fieldPrefix='pcs',wantSelectFields=['CreateTime','VoltageA'])
s.addTable('Device',fieldPrefix='dev',wantSelectFields=['Name','State'])

则我们将从PCS和Device两表中查询数据,其中:

  • 从PCS获取CreateTime字段的数据,命名为【pcsCreateTime】

  • 从PCS获取VoltageA字段的数据,命名为【pcsVoltageA】

  • 从Device获取Name字段的数据,命名为【devName】

  • 从Device获取State字段的数据,命名为【devState】

即,查询s执行后,所得到的结果中每一行都是四个数据所组成的dict:

{
	'pcsCreateTime':xxxx,
	'pcsVoltageA':xxxx,
	'devName':xxxx,
	'devState':xxxx,
}

addTable对象函数说明:

addTable(self,clsName,fieldPrefix=None,wantSelectFields=[])

参数:
	clsName:继承自ORM的数据类名,必须是ORM.register注册过的数据类名
	fieldPrefix:为该数据类所指定的表别名,该表查询出来的数据都会自动添加该别名,这样多个表的同名字段就不存在歧义了
	wantSelectFields:需要获取的该表的字段,如果不给则读取所有字段

4、把表连接起来

我们通过addTable增加了两个表,那么这两个表的连接条件是什么呢?我们必须要通过addTableJoin来进行join:

s.addTableJoin('pcs','DevID','dev','ID')

即把两个表联合起来的条件是:pcs.DevID = dev.ID。pcs和dev分别是我们上面addTable时指定的表别名。

addTableJoin对象函数说明:

addTableJoin(self,tableAlias1,field1,tableAlias2,field2)

参数:
	tableAlias1:要链接的第一个表的别名
	field1:要链接的第一个表中的字段名
	tableAlias2:要链接的第二个表的别名
	field3:要链接的第二个表中的字段名

有三个以上表的话,依次用addTableJoin来增加增加链接条件。

5、设置查询条件

一般来说,查询基本都是条件查询,对query更是如此,因为分表时如果不知道一个最开始的时间起点,query也不知道应该从哪个表查起。

query的查询条件有六种:

Equal(self,clsAlias,field,value)
NoEqual(self,clsAlias,field,value)
Great(self,clsAlias,field,value)
GreatEqual(self,clsAlias,field,value)
Less(self,clsAlias,field,value)
LessEqual(self,clsAlias,field,value)

如:

#母线电压低于100V
s.Less('pcs','VoltageC',100)
#供货厂家是:sup123
s.Equal('dev','Supply','sup123')
#最重要的,起始查询时间应大于等于
s.GreatEqual('dev','CreateTime','2023-06-28 12:34:56')

注:再次强调,由于设置了是基于PCS的CreateTime进行分表,所以查询条件中必须要有PCS的CreateTime字段Great或GreatEqual某个值的查询条件

5、开始查询

s.start()

本语句其实就是定位需要查找的所有分表的表名list,所以如果没有分表参与,则可忽略,如果有分表,则必须调用本函数。

6、读取数据

准备了半天,读取数据却是非常简单的:

for d in s:
	...

注:重复一遍,query是基于limit做分页查询、支持分表查询的,而所有这些细节开发者都不必关心,只需要用for循环来读就够了。query已经实现了__next__和__iter__以在for循环时自动完成对分页和分表的支持与切换

参考资料:

jxTMS设计思想

jxTMS编程手册

下面的系列文章讲述了如何用jxTMS开发一个实用的业务功能:

如何用jxTMS开发一个功能

下面的系列文章讲述了jxTMS的一些基本开发能力:

jxTMS的HelloWorld

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值