日韩性视频-久久久蜜桃-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查询平台使用)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 一区二区在线免费看 | 婷婷综合色 | 91捆绑91紧缚调教91 | 成人免费看aa片 | 水蜜桃av在线 | 欧美亚洲另类小说 | 国产卡一卡二 | 欧美性猛交xxxx乱大交俱乐部 | 欧美精品中文 | 黑人玩弄人妻一区二区三区四 | 亚洲国产欧美一区二区三区深喉 | 日韩啪啪片 | 国产午夜福利在线播放 | 色多多视频在线 | 久久国产成人精品 | 国产老熟妇精品观看 | 国产色 | 国产精品欧美综合 | av毛片在线免费观看 | 欧美日韩看片 | 白嫩初高中害羞小美女 | 黑人玩弄人妻一区二区三区四 | 日本一区二区免费在线 | 日韩久久不卡 | 精品电影在线观看 | 农村偷人一级超爽毛片 | 操你啦免费视频 | 国产成人手机视频 | 欧美伊人久久 | 亚洲成av人片在线观看无 | 国产区免费观看 | 嫩草影院懂你的影院 | 无码一区二区三区免费视频 | 欧美日韩国产不卡 | 99久久综合国产精品二区 | 在线播放日韩av | 99视频在线免费观看 | 99ri在线观看 | 日本三级韩国三级三级a级中文 | 欧美精产国品一二三区 | 精品午夜一区二区三区在线观看 | 久久久高潮 | 超碰国产在线 | 致命魔术电影高清在线观看 | 欧美激情性生活 | 午夜18视频在线观看 | 婷婷超碰 | 国产片久久 | 国产欧洲亚洲 | 国产精品亚洲一区二区三区 | 久久中文一区 | 久久亚洲精少妇毛片午夜无码 | 日本免费成人 | 电影《两个尼姑》免费播放 | 日本二三区 | 光棍影院手机版在线观看免费 | 成人另类小说 | 色丁香综合 | 亚洲国产麻豆 | 爱爱15p| 艳母动漫在线播放 | 色中文在线| 黄色观看网站 | 污污视频在线免费观看 | 免费在线观看的黄色网址 | 我的公把我弄高潮了视频 | 一个人在线观看免费视频www | 久久久国产精品一区 | 伦伦影院午夜理伦片 | 成人做爰www看视频软件 | 亚洲一区激情 | 久久曰视频 | 亚洲精品久久久久久无码色欲四季 | 影音先锋黄色网址 | 精品三级电影 | 97精品人妻一区二区三区蜜桃 | 欧色av| 国产精品国产三级国产专播品爱网 | 娇妻之欲海泛舟无弹窗笔趣阁 | 中文字幕日日夜夜 | 青青草华人在线 | 国产毛片3| 免费毛片基地 | 国产第113页 | 成人免费毛片嘿嘿连载视频 | 亚洲 欧美 另类 综合 偷拍 | 影音先锋中文字幕在线播放 | jzzijzzij亚洲成熟少妇18 欧美www在线观看 | 欧美国产日韩精品 | 久久久久久久久久久99 | 久久久久区 | 亚洲精品乱码久久久久久 | 四虎影库在线播放 | 国产精品永久免费视频 | 欧美高清久久 | 欧美乱码精品 | 少妇肥臀大白屁股高清 | 日韩国产中文字幕 | 99久久精品国产亚洲 |