首先谈谈应用场景吧,前提是针对查询接口做接口自动化,接口校验的脚本中,一般以响应报文作为预期值,通过sql查出的数据库值作为实际值,二者对比通过则认为接口输出正确。而sql从何而来呢,对于查询接口一般是通过入参作为筛选条件+程序内部逻辑共同决定了我们脚本中查询sql该怎么写。下面将举例工作中遇到的几种场景,带入比较简单粗暴的场景,不一定形象,主打一个意会~。>.<
假设有一个水果店水果统计的查询接口,它的入参有店名、水果名称、进货日期,店名必填,后两者如果传则作为筛选条件,不传则全量查。那分析下来可能就存在四种情况:
1.店名='水果店'
2.店名='水果店' and 水果名称='西瓜'
3.店名='水果店' and 进货日期='20240316'
4.店名='水果店' and 水果名称='西瓜' and 进货日期='20240316'
这时候就到了我之前疑问的地方,这么多场景,我要怎么决定我的sql怎么写呢?首先可以明确的,肯定是要根据入参是否传,来决定sql中要不要筛选,那么就有了下面的实现方式:
def sgdDemo(reqmsg, resmsg,):#重点关注where后面查询条件的处理,对于与整个sql拼接的部分,后面有时间再写啦~ser = []if(reqmsg["店名"]) != "":sql = "店名='" + reqmsg["店名"]+"'"ser.append(sql)if(reqmsg["水果名称"]) != "":sql = "水果名称='" + reqmsg["水果名称"]+"'"ser.append(sql)if(reqmsg["进货日期"]) != "": sql= "进货日期='" + reqmsg["进货日期"]+"'"ser.append(sql)ret = ' and '.join(ser)return retif __name__ == '__main__':ret1 = sgdDemo({"店名":"水果店","水果名称":"","进货日期":""},"")ret2 = sgdDemo({"店名":"水果店","水果名称":"西瓜","进货日期":""},"")ret3 = sgdDemo({"店名":"水果店","水果名称":"","进货日期":"20240316"},"")ret4 = sgdDemo({"店名":"水果店","水果名称":"西瓜","进货日期":"20240316"},"")print(ret1)print(ret2)print(ret3)print(ret4)
运行效果如下:
问题看似好像解决了,那么又引入了新的问题,示例只有3个入参,如果入参扩大到成百上千个,那还要写几百几千个if来一一判断吗,好像不太现实呢,效率也很低。这个时候就考虑引入for循环,一旦发现为空则跳出循环,否则进行赋值处理
def sgdDemo2(reqmsg, resmsg):ser = []for i in reqmsg:if(reqmsg[i] != ""):sql = i + "='" +reqmsg[i]+"'"ser.append(sql)ret = ' and '.join(ser)return retif __name__ == '__main__':ret1 = sgdDemo2({"店名": "水果店", "水果名称": "", "进货日期": ""}, "")ret2 = sgdDemo2({"店名": "水果店", "水果名称": "西瓜", "进货日期": ""}, "")ret3 = sgdDemo2({"店名": "水果店", "水果名称": "", "进货日期": "20240316"}, "")ret4 = sgdDemo2({"店名": "水果店", "水果名称": "西瓜", "进货日期": "20240316"}, "")ret5 = sgdDemo2({"店名": "水果店", "水果名称": "西瓜", "进货日期": "20240316","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","10":"10","11":"11","12":"12",}, "")print(ret1)print(ret2)print(ret3)print(ret4)print(ret5)
这么看好像是精简了一些,但是又提出疑问了,如果入参字段值并不是完全对应数据库字段值呢,假设有一个字段temp,它的值大于1则在数据库中存储A,否则存储为B,那么就需要加上if条件来特殊处理。
其他场景也是类似的,例如字段对应数据库字段的第N位,那就可以使用substr来实现等等。
哦吼,遗漏了一个重要的点,其实接口报文的字段,大多与数据库表字段不是一样的,在拼接sql前,需要提前做好字段的映射,从而保证字段能够一一对应,分享到这里就结束啦~~