回答自己一年前的一个问题,python如何动态拼接sql

        首先谈谈应用场景吧,前提是针对查询接口做接口自动化,接口校验的脚本中,一般以响应报文作为预期值,通过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前,需要提前做好字段的映射,从而保证字段能够一一对应,分享到这里就结束啦~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/544569.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高可用系统有哪些设计原则

1.降级 主动降级&#xff1a;开关推送 被动降级&#xff1a;超时降级 异常降级 失败率 熔断保护 多级降级2.限流 nginx的limit模块 gateway redisLua 业务层限流 本地限流 gua 分布式限流 sentinel 3.弹性计算 弹性伸缩—K8Sdocker 主链路压力过大的时候可以将非主链路的机器给…

校园博客系统 |基于springboot框架+ Mysql+Java的校园博客系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunwen参考 摘要 研究…

maven工程,未被idea识别为maven工程怎么办?

示例&#xff1a;以下工程的pom文件图标不是一个蓝色的m&#xff0c;所以未被识别为maven工程。 解决办法&#xff1a;打开pom.xml文件—>右键—>add as maven project 问题解决&#xff1a;

如何在IDEA 中设置背景图片

在IDEA 中设置背景图片&#xff0c;可以按照以下步骤操作&#xff1a; 1、打开 IntelliJ IDEA 软件&#xff0c;进入代码编辑主界面。 点击编辑窗口上方的“File”菜单项。 2、在下拉子菜单中&#xff0c;选择“Settings”选项&#xff08;如果你使用的是 macOS&#xff0c;可…

【机器学习】分类模型的评价方法

&#x1f33b;个人主页&#xff1a;相洋同学 &#x1f947;学习在于行动、总结和坚持&#xff0c;共勉&#xff01; #学习笔记# 目录 一、混淆矩阵&#xff08;Confusion Matrix&#xff09; 二、评估指标&#xff08;Evaluation metrics&#xff09; 1.正确率(accuracy) …

OpenCV系列文章目录(持续更新中......)

引言&#xff1a; OpenCV是一个开源的计算机视觉库&#xff0c;由英特尔公司开发并开源的一组跨平台的C函数和少量的C函数组成&#xff0c;用于实时图像处理、计算机视觉和机器学习等应用领域。OpenCV可以在包括Windows、Linux、macOS等各种操作系统平台上使用&#xff0c;具…

重学SpringBoot3-整合SSM

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-整合SSM Spring Boot整合SSM示例1. 创建Spring Boot项目2. 配置数据源3. 配置MyBatis4. 实现数据访问对象&#xff08;DAO&#xff09;5. 编写服务层和控…

力扣热题100_矩阵_240_搜索二维矩阵 II

文章目录 题目链接解题思路解题代码 题目链接 240. 搜索二维矩阵 II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xf…

【计算机视觉】二、图像形成——实验:2D变换编辑(Pygame)

文章目录 一、向量和矩阵的基本运算二、几何基元和变换1、几何基元(Geometric Primitives)2、几何变换(Geometric Transformations)2D变换编辑器0. 程序简介环境说明程序流程 1. 各种变换平移变换旋转变换等比缩放变换缩放变换镜像变换剪切变换 2. 按钮按钮类创建按钮 3. Pygam…

RabbitMQ高级-高级特性

1.消息可靠性传递 在使用RabbitMQ的时候&#xff0c;作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ为我们提供了两种方式来控制消息的投递可靠性模式 1.confirm 确认模式 确认模式是由exchange决定的 2.return 退回模式 回退模式是由routing…

Ubuntu Linux - Primavera P6 EPPM 安装及分享

引言 根据计划&#xff0c;近日我制作了基于Ubuntu Linux 的P6虚拟机环境&#xff0c;同样里面包含了全套P6 最新版应用服务 此虚拟机仅用于演示、培训和测试目的。如您在生产环境中使用此虚拟机&#xff0c;请先与Oracle Primavera销售代表取得联系&#xff0c;以获取所需的应…

Python Web开发记录 Day12:Django part6 用户登录

名人说&#xff1a;东边日出西边雨&#xff0c;道是无晴却有晴。——刘禹锡《竹枝词》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 1、登录界面2、用户名密码校验3、cookie与session配置①cookie与session②配置…