日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

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

發布時間:2023/12/2 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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值。

如果您覺得本站對你有幫助,那么可以支付寶掃碼捐助以幫助本站更好地發展,在此謝過。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的python查询sql_Python处理SQL语句(提供SQL查询平台使用)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美日韩人妻精品一区 | 成人欧美在线 | 人妻av无码一区二区三区 | 国产女人叫床高潮大片免费 | 国产精品免费观看视频 | 婷婷精品在线 | 春色校园激情 | 天天干天天日 | 深夜免费在线视频 | 黄色91 | 对白超刺激精彩粗话av | 中文字幕一区二区三区乱码在线 | 天天拍夜夜拍 | 黄色动漫在线观看 | 亚洲精品成人电影 | 91精品欧美 | 又污又黄又爽的网站 | 久久性网 | 高清无码视频直接看 | 法国极品成人h版 | 日韩精品一区二区三区色欲av | 成年人网站免费在线观看 | 去毛片| 色播激情 | 国产一区二区观看 | 国产一级大片在线观看 | 又大又硬又爽免费视频 | 麻豆视频在线观看免费 | 91精品国产综合久久久久久 | 韩国毛片视频 | 欧美黄色一级生活片 | 免费又黄又爽又色的视频 | 免费在线你懂的 | а√天堂8资源中文在线 | 欧美 亚洲 一区 | 国产精品麻豆入口 | 污污内射久久一区二区欧美日韩 | 91在线无精精品白丝 | 亚洲天堂精品一区 | www.男人天堂.com| 免费一区二区三区 | 国产成人精品亚洲线观看 | 男女吻胸做爰摸下身 | 一级黄色在线播放 | 亚洲久久成人 | 国产无遮挡又黄又爽又色视频 | 国产99在线 | 大肉大捧一进一出视频 | 国产在线网 | 午夜视频免费在线 | 野花视频在线免费观看 | av最新在线 | 97国产在线 | 一区二区三区视频在线免费观看 | 亚洲爱爱图 | 国产一区二区三区视频网站 | 国产黄色片在线观看 | 欧美一级免费视频 | 免费成人看视频 | 好吊操视频这里只有精品 | 一区二区在线视频播放 | 国产欧美日韩久久 | 五月天激情视频 | 欧美色啪 | 波多野结衣午夜 | 日韩一二三区 | 人人干人人看 | 美女主播福利视频 | 国产一级久久久 | 免费av一级 | 伊人青青草视频 | 欧美精品一区二区蜜桃 | 超碰8| 伊人网综合网 | 亚洲激情网址 | 国精品无码一区二区三区 | 日韩视频精品 | 日韩精品一区二区在线看 | 日韩不卡一二区 | 久操视频网 | 少妇29p| 成人免费在线电影 | 色综合天天综合网天天看片 | 久久亚洲精品国产精品黑人v | 夜夜摸夜夜爽 | 性猛交ⅹxxx富婆视频 | 轻点好疼好大好爽视频 | 草草影院最新网址 | 欧美一卡二卡三卡 | 噜噜噜网站| 欧美久久久久久久久久 | 亚洲骚| 深夜福利亚洲 | 四虎网址在线观看 | www.色多多 | 日本一区二区成人 | 在线播放a | 成人无码久久久久毛片 | 一级黄色大毛片 |