回答自己一年前的一个问题,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.mzph.cn/news/749994.shtml

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

相关文章

perl 用 XML::DOM 解析 Freeplane.mm文件,生成测试用例.csv文件

Perl 官网 www.cpan.org 从 https://strawberryperl.com/ 下载网速太慢了 建议从 https://download.csdn.net/download/qq_36286161/87892419 下载 strawberry-perl-5.32.1.1-64bit.zip 约105MB 解压后安装.msi&#xff0c;装完后有520MB&#xff0c;建议安装在D:盘。 运行 …

HarmonyOS NEXT应用开发—组件堆叠

介绍 本示例介绍运用Stack组件以构建多层次堆叠的视觉效果。通过绑定Scroll组件的onScroll滚动事件回调函数&#xff0c;精准捕获滚动动作的发生。当滚动时&#xff0c;实时地调节组件的透明度、高度等属性&#xff0c;从而成功实现了嵌套滚动效果、透明度动态变化以及平滑的组…

【论文阅读】Energy Efficient Real-time Task Scheduling on CPU-GPU Hybrid Clusters

Energy Efficient Real-time Task Scheduling on CPU-GPU Hybrid Clusters 出处&#xff1a;2017IEEE Xplore 基于CPU-GPU混合集群的高效实时任务调度 主要工作&#xff1a;通过动态电压和频率缩放研究了新兴CPU-GPU混合集群的节能问题。 首次分析GPU特定的DVFS模型。 设计了…

Web核心,HTTP,tomcat,Servlet

1&#xff0c;JavaWeb技术栈 B/S架构:Browser/Server&#xff0c;浏览器/服务器架构模式&#xff0c;它的特点是&#xff0c;客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务器端。浏览器只需要请求服务器&#xff0c;获取Web资源&#xff0c;服务器把Web资源…

安装snap再安装flutter再安装localsend@Ubuntu(FreeBSD下未成功)

Localsend介绍 localsend是一个跨平台的文件传送软件&#xff0c;可以在Windows、MacOS、Linux、Android和IOS下互相传送文件&#xff0c;只要在同一个局域网即可。 localsend官网&#xff1a;LocalSend 尝试安装localsend&#xff0c;发现需要使用flutter&#xff0c; 安装f…

阿里二面:什么情况会发生Full GC?如何避免频繁Full GC?

阿里二面&#xff1a;什么情况会发生Full GC&#xff1f;如何避免频繁Full GC&#xff1f; Minor GC、Major GC 和 Full GC区别&#xff1f; Minor GC、Major GC和Full GC是垃圾回收中的三个重要概念&#xff0c;它们描述了垃圾回收的不同阶段和范围&#xff1a; Minor GC&am…

自定义协议

应用层 有许多现成的协议(HTTP协议做网站必备),也有许多需要程序员自定义的协议. 1.自定义协议 自定义协议: 1.明确传递的信息是什么 2.约定好信息按照什么样的格式来组织成二进制字符串 举个例子: 当我们点外卖时,打开软件,会显示商家列表,列表中有很多项,每一项都包含了一…

Tuxera NTFS 2023安装使用教程 Tuxera NTFS破解版 Tuxera NTFS for Mac优惠

对于必须在Windows电脑和Mac电脑之间来回切换的Mac朋友来说&#xff0c;跨平台不兼容一直是一个巨大的障碍&#xff0c;尤其是当我们需要使用NTFS格式的硬盘在Windows和macOS之间共享文件时。因为Mac默认不支持写入NTFS磁盘。 为了解决这一问题&#xff0c;很多朋友会选择很便捷…

React理念——Fiber架构的主要原理

React理念——Fiber架构的主要原理 React 理念CPU 的瓶颈IO 的瓶颈 Fiber的产生及原理如何构建副作用链表 React 理念 从官网看到React的理念&#xff1a; React 是用 JavaScript 构建快速响应的大型 Web 应用程序的首选方式。它在 Facebook 和 Instagram 上表现优秀。 可见&a…

对LitJson开源插件的自定义尝试

简介 LitJson是一款知名的Json字符串数据转换的插件&#xff0c;基于.Net开发&#xff0c;使用C#作为开发语言。本文旨在基于所学的编程知识以及对LitJson源码的理解来尝试对LitJson插件进行自定义。 自定义思路 &#xff08;一&#xff09;问题 结合我在使用LitJson过程中遇到…

Selenium基础

1. selenium简介 用于实现自动化测试的 python 包&#xff0c;使用前需要安装对应浏览器驱动 from time import sleep from selenium import webdriver option webdriver.ChromeOptions() # 指定chrome存储路径的二进制形式 option.binary_locationD:\Chrome\Google\Chrome\Ap…

企业计算机服务器中了halo勒索病毒怎么办,halo勒索病毒解密工具流程

随着网络技术的不断应用与发展&#xff0c;越来越多的企业开始利用网络开展各项工作业务&#xff0c;网络为企业的发展与生产生活提供了极大便利。但网络中的勒索病毒攻击企业服务器的事件频发&#xff0c;给企业的数据安全带来了严重威胁&#xff0c;数据安全问题一直是企业关…

pytorch CV入门 - 汇总

初次编辑&#xff1a;2024/2/14&#xff1b;最后编辑&#xff1a;2024/3/9 参考网站-微软教程&#xff1a;https://learn.microsoft.com/en-us/training/modules/intro-computer-vision-pytorch 更多的内容可以参考本作者其他专栏&#xff1a; Pytorch基础&#xff1a;https…

ArrayList 源码解析和设计思路

ArrayList 一、继承体系二、接口继承三、标记接口四、设计目的五、框架总体结构六、工作原理七、创建List对象初始化&#xff1f;还是add()添加元素初始化?七、add(E e)添加元素八、remove&#xff08;int index&#xff09;删除元素八、线程安全问题 一、继承体系 ArrayLis…

智慧城市革命,物联网技术如何改变城市治理与生活方式

随着科技的不断进步&#xff0c;智慧城市已经成为现代城市发展的重要方向之一。物联网技术作为智慧城市的重要支撑&#xff0c;正深刻改变着城市的治理模式和居民的生活方式。本文将探讨智慧城市革命&#xff0c;以及物联网技术如何改变城市治理与生活方式&#xff0c;同时介绍…

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

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

STM32CubeMX与HAL库开发教程八(串口应用/轮询/中断/DMA/不定长数据收发)

目录 前言 初识串口-轮询模式 串口中断模式收发 串口DMA模式 蓝牙模块与数据包解析 前言 前面我们简单介绍过串口的原理和初步的使用方式&#xff0c;例如怎么配置和简单的收发&#xff0c;同时我们对串口有了一个初步的了解&#xff0c;这里我们来深入的来使用一下串口 …

Linux服务器(RedHat、CentOS系)安全相关巡检shell脚本

提示&#xff1a;巡检脚本可以使用crontab定时执行&#xff0c;人工根据执行结束时间点统一收集报告文件即可。 #!/bin/bash# Define output file current_date$(date "%Y%m%d") # Gets the current date in YYYYMMDD format echo >server_security_inspection_r…

Leetcode 第 126 场双周赛 Problem C 替换字符串中的问号使分数最小(Java + 排序 + 贪心)

文章目录 题目思路Java 排序 贪心第一步&#xff1a;第二步&#xff1a;第三步&#xff1a; 复杂度Code 题目 Problem: 100249. 替换字符串中的问号使分数最小给你一个字符串 s 。s[i] 要么是小写英文字母&#xff0c;要么是问号 ‘?’ 。对于长度为 m 且 只 含有小写英文字…

任职资格中的一些面试题和知识点

目录 一、计算机数据结构基本概念理解&#xff1a;1. 数组基本概念优缺点以及如何改进常用的操作底层实现还有哪些容易问到的问题&#xff1a;关于数组的一些衍生数据结构和算法问题 2. 链表基本概念&#xff1a;链表的节点是什么&#xff1f;每个节点包含哪些信息&#xff1f;…