python查询sql_Python处理SQL语句(提供SQL查询平台使用)

在搞公司的SQL查询(MySQL)平台时,需要对用户查询SQL进行条数限制,默认是在配置文件中配置一个“limit = 1000”这样的参数。最自然想到的就是对用户通过web传入的SQL做处理,默认加上limit参数。这样一来就有这么几个问题需要处理:

1. 如果用户自己传入了limit 10这样的条件怎么办?

2. 如果用户自己传入了limit 10,2这样的条件怎么办?

3. 如果用户的查询比较复杂,有多个子查询并带有limit怎么办?

4. 如果用户查询字段有`limit`(不加“时的SQL会报语法错误)、及表名有limit这样的关键字怎么办?

测试通过代码如下,提供一个处理函数:

import json

import re

def replace_limit(sql, limit):

"""

依次查找并处理limit offset,然后把limit关键字替换为special_flag

全部处理完后再把special_flag替换回limit

:param sql:

:param limit:

:return:

"""

special_flag = '-*-*-'

def fun(new_sql):

"""

:return: sql

"""

upper_sql = new_sql.upper()

start_index = upper_sql.find(' LIMIT ') + len(' LIMIT ')

end_index = start_index

for i in range(start_index, len(upper_sql)):

if bool(re.match(r'^[0-9]|,| ', upper_sql[i])):

end_index += 1

else:

break

limit_str = upper_sql[start_index:end_index].strip()

# 输入limit值大于默认limit值就进行替换成默认limit值

if ',' in limit_str:

offsets = limit_str.split(',')

if int(offsets[-1]) > limit:

limit_str = '{}, {}'.format(offsets[0], limit)

else:

if int(limit_str) > limit:

limit_str = '{}'.format(limit)

limit_str = ' ' + limit_str + ' '

new_sql = new_sql.replace(

new_sql[start_index:end_index], limit_str, 1

)

new_sql = new_sql.replace(

new_sql[start_index - len(' LIMIT '):start_index], special_flag, 1

)

return new_sql

# 原sql没有limit则在最后加上limit,并return

if re.search(r'limit\s.*\d.*', sql, re.IGNORECASE) is None:

sql = sql.rstrip(';') + ' limit %s' % int(limit) + ';'

return sql

# 分析limit语句

for i in re.findall(' limit ', sql, re.IGNORECASE):

sql = fun(sql)

# 替换回limit关键字

sql = sql.replace(special_flag, ' limit ')

return sql

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

importjson

importre

defreplace_limit(sql,limit):

"""

依次查找并处理limitoffset,然后把limit关键字替换为special_flag

全部处理完后再把special_flag替换回limit

:paramsql:

:paramlimit:

:return:

"""

special_flag='-*-*-'

deffun(new_sql):

"""

:return:sql

"""

upper_sql=new_sql.upper()

start_index=upper_sql.find(' LIMIT ')+len(' LIMIT ')

end_index=start_index

foriinrange(start_index,len(upper_sql)):

ifbool(re.match(r'^[0-9]|,| ',upper_sql[i])):

end_index+=1

else:

break

limit_str=upper_sql[start_index:end_index].strip()

# 输入limit值大于默认limit值就进行替换成默认limit值

if','inlimit_str:

offsets=limit_str.split(',')

ifint(offsets[-1])>limit:

limit_str='{}, {}'.format(offsets[0],limit)

else:

ifint(limit_str)>limit:

limit_str='{}'.format(limit)

limit_str=' '+limit_str+' '

new_sql=new_sql.replace(

new_sql[start_index:end_index],limit_str,1

)

new_sql=new_sql.replace(

new_sql[start_index-len(' LIMIT '):start_index],special_flag,1

)

returnnew_sql

# 原sql没有limit则在最后加上limit,并return

ifre.search(r'limit\s.*\d.*',sql,re.IGNORECASE)isNone:

sql=sql.rstrip(';')+' limit %s'%int(limit)+';'

returnsql

# 分析limit语句

foriinre.findall(' limit ',sql,re.IGNORECASE):

sql=fun(sql)

# 替换回limit关键字

sql=sql.replace(special_flag,' limit ')

returnsql

这个函数接收两个参数,SQL语句和默认limit限制值,在平台中是SQL是从前端获取来的,limit值是从配置文件获取来的。

大概逻辑如下:

1. 如果字段中有`limit`或limittest关键字就不需要处理。

2. 如果用户输入没有limit限制就加上默认limit限制,然后直接返回sql。

3. 如果用户输入有limit限制就进行判断用户输入值是否大于默认值,如果大于就替换成默认值,否则不改动。

4. 最后把替换过的关键字再替换回来。

在这里测试,就可以直接调用函数即可,如下:

sql = "select limitest as `limit` from test limit 10, 100;"

print(replace_limit(sql, 20))

1

2

sql="select limitest as `limit` from test limit 10, 100;"

print(replace_limit(sql,20))

结果如下:

select limitest as `limit` from test limit 10, 20;

1

selectlimitestas`limit`fromtestlimit10,20;

可以看到结果满足我们的需求,由于用户输入值大于默认值就替换成了默认limit值。

如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。

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

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

相关文章

php组成,php接口有几部分组成?

程序接口,由一套陈述、功能、选项、其它表达程序结构的形式、以及程序师使用的程序或者程序语言提供的数据组成PHP接口(interface)的特点1、接口的方法必须是公开的。2、接口的方法默认是抽象的,所以不在方法名前面加abstract。3、接口可以定义常量&…

AWS Elasticsearch后模式

因此,碰巧我们在SaaS版本的LogSentinel上遇到了生产问题–我们的Elasticsearch停止了对新数据编制索引。 由于Elasticsearch只是辅助存储,因此没有数据丢失,但这给我们的客户带来了一些问题(他们无法在其仪表板上看到实时数据&…

python设置word背景色_Python数据可视化:WordCloud入门

WordCloud是一种很好的展现数据的方式,网上也有不少小工具和在线网页。但是有些不支持中文,有些安装复杂,所以决定用Python实现。主要参考官网,通过官网的例子,讲一下WordCloud的制作。主要流程获取内容的路径如果是一…

java 解析日期格式_日期/时间格式/解析,Java 8样式

java 解析日期格式自Java 几乎 开始以来,Java开发人员就通过java.util.Date类(自JDK 1.0起)和java.util.Calendar类(自JDK 1.1起 )来处理日期和时间。 在这段时间内,成千上万(甚至数百万&#x…

php第三方登录代码,thinkPHP5项目中实现QQ第三方登录功能

本文实例讲述了thinkPHP5项目中实现QQ第三方登录功能。分享给大家供大家参考,具体如下:最近用thinkPHP 5框架做了一个婚纱店的项目,在开发过程中需要用到第三方登录,腾讯官方给的案例是几个文件相互包含实现的,放到tp5…

mac 显示隐藏文件_如何在Mac上显示隐藏文件?苹果mac显示隐藏文件夹方法

与任何操作系统一样,macOS会将重要文件隐藏起来,以防止意外删除它们并因此而损坏系统。但是,在某些情况下,您可能需要在Mac上显示隐藏文件,例如,浏览“ 库”文件夹并清除旧日志,缓存或其他垃圾文…

分布式虚拟跟踪

跟踪提供了对系统的可见性,使开发人员和操作人员可以在运行时观察应用程序。 当系统不断增长并与更多微服务进行交互时,跟踪变得非常有价值。 在这样的环境中,这些痕迹非常棒,可以定位导致性能下降的故障和瓶颈。 在这篇文章中&a…

php 删除数组的空元素,php删除数组空元素的方法_后端开发

php如何实现自动跳转_后端开发php实现自动跳转的方法:1、通过php内置函数“header”,将http响应头中的“Location”设置为要跳转的URL即可;2、可以在javascript代码中将“window.location.href”指向要跳转的URL即可。php删除数组空元素的方法…

map for循环_JavaScript 用 for 循环太 low?你是不是有什么误解

天要吐槽下,我时不时地看到有些文章说“循环语句不好,你应该用 filter,map 和 reduce ”——每次看到有文章鼓吹,所有需要循环的场景一律用这几个函数式方法,我都恨得牙痒痒。没错,这些函数式方法确实有它们…

vue 动态组件组件复用_真正的动态声明性组件

vue 动态组件组件复用在这篇简短的文章中,我将重点介绍ADF动态声明性组件。 我的意思是一个众所周知的ADF标签af:declarativeComponent 。 它可以用作将页面设计为页面片段和组件组成的一种非常便捷的方法。 例如,我们的页面可以包含以下代码…

简单工程验收单表格_中铁超大型工程项目-123个精细化管理手册配套表格附件,超全...

中铁超大型工程项目-123个精细化管理手册配套表格附件,超全!什么是项目精细化?答:工程项目精细化管理是一个系统的管理体系,包含一系列管理制度和办法,除了《工程项目精细化管理办法》这个纲领性文件外&…

php 执行 javascript,Bash/PHP/Javascript:如何运行输出javascript的php文件,并执行该javascript?...

目前我试图发送一个webhook请求来争执,所以我可以发送更新到我的资源库到我的不一致服务器中的一个频道。如果我在浏览器中加载页面,它会运行此代码,并且该消息将出现在我的不一致中:$(document).ready(function(){setTimeout(sen…

递归分解WAR文件

抽象 是否曾经需要分解WAR文件以及分解WAR文件中的所有JAR文件? 是的,我也是! 我写了Ferris-war-exploder来爆炸: 一个JAR文件 一个WAR文件,它找到的每个JAR文件也会爆炸。 包含每个JAR文件(请参阅&…

判断unsigned long long乘法溢出_信息安全课程17:缓冲区溢出2

在之前所讲述的内容中,都是我们在自己的程序中自行修改的;正常情况下,没有程序员会在自己的代码中这样写——那有没有办法攻击别人正常的程序呢?攻击者怎么样能够影响到不是自己的程序的返回地址呢?以及怎么样通过攻击…

java 保垒机telnet,开源堡垒机系统Teleport

一. teleport简介Teleport是一款简单易用的堡垒机系统,具有小巧、易用的特点,支持 RDP/SSH/SFTP/Telnet 协议的远程连接和审计管理。Teleport由两大部分构成:跳板核心服务WEB操作界面官网地址: https://tp4a.com/ 官网文档: https://docs.…

choiceformat_ChoiceFormat:数字范围格式

choiceformatChoiceFormat类的Javadoc指出ChoiceFormat “允许您将格式附加到一系列数字上”,并且“通常在MessageFormat中用于处理复数”。 这篇文章描述了java.text.ChoiceFormat并提供了一些在Java代码中应用它的示例。 ChoiceFormat与java.text包中其他“ 格式…

python和rpa_什么是RPA

产品介绍阿里云RPA产品是一款新型工作流程自动化办公机器人软件,通过模拟人工操作进行自动流程执行处理。它可以将办公人员从每日的重复工作中解放出来,提高生产效率。具体而言,阿里云RPA是基于软件机器人和人工智能(AI,Artificia…

php背景图片随页面大小改变,css背景图根据屏幕大小自动缩放

css背景图根据屏幕大小自动缩放代码:html,body{margin:0px;padding:0px;}#background { position: fixed;top: 0;left: 0;width: 100%;height: 100%;overflow: hidden;background-color: #211f1f; display:none\8;}#background .bg-photo {position: absolute;top: …

Java –缺少字体–崩溃的应用程序!

Eclipse MAT和Heaphero都是分析大型堆转储的流行Java工具。 最近,当我们尝试在Eclipse MAT中分析堆转储文件时遇到了一个有趣的问题。 工具因缺少字体crash而崩溃。 我们认为我们将与您分享发现的结果。 CompositeStrike.getStrikeForSlot()…

forever不重启 node_运维监控Prometheus,部署安全的node_exporter监控主机

简介prometheus监控系统的时候,是使用pull的方式来获取监控数据,需要被监控端监听对应的端口,prometheus从这些端口服务中拉取对应的数据。node_exporter安全性讨论node_exporter是收集操作系统的指标的一个程序。例如CPU,内存&am…