python正则表达式抽取mysql慢查询sql本身,de-parameterize,将参数值改为?

这个问题我提在了 StackOverflow 上,但没有回答。自己写吧

我的需求是,将mysql slow queries展现到页面上。但是如果原始展现,会带不同参数,不太好group等。其实我们关心的只是sql本身,比如

-- 这俩其实是一条慢查询
select * from a where a>1 and b=‘r‘ and c=3;
select * from a where a>2 and b=‘x‘ and c=5;
-- 希望能处理到
select * from a where a>? and b=‘?‘ and c=?

因为没有很合适的module,所以得用regrex替换。数字很容易,字符串需要考虑

  1. 最基本的,替换数字可以用r"\b\d+\b" 独立的一个或多个连续数字,这样不会替换如col1等对象中的数字
  2. 简单地,字符串可以用r"‘[^‘]*‘" 表示2个‘之间所有非‘的连续字符,这样可以适用大多数情况,除了字符串有空格的,比如‘a   bdf c‘就不行了
  3. 最严谨的方式,按‘对sql划分数组。这样所有‘‘里面的字符串都是偶数成员,其他部分奇数成员。替换偶数成员为?就可以了

代码如下import re

sql = r"select * from a where id=‘aaaaa haha wocao‘ and id1= ‘fff‘ and xx=1 and a3= 4 and a4=3434343 and a5a>99"
sql.split("‘")
#[‘select * from a where id=‘, ‘aaaaa haha wocao‘, ‘ and id1= ‘, ‘fff‘, ‘ and xx=1 and a3= 4 and a4=3434343 and a5a>99‘]
sarr = sql.split("‘")
sarr
#[‘select * from a where id=‘, ‘aaaaa haha wocao‘, ‘ and id1= ‘, ‘fff‘, ‘ and xx=1 and a3= 4 and a4=3434343 and a5a>99‘]
sarr[::2]
#[‘select * from a where id=‘, ‘ and id1= ‘, ‘ and xx=1 and a3= 4 and a4=3434343 and a5a>99‘]
sarr[1::2]
#[‘aaaaa haha wocao‘, ‘fff‘]

sarr[1::2]= [‘?‘ for x in sarr[1::2]]
sarr
#[‘select * from a where id=‘, ‘?‘, ‘ and id1= ‘, ‘?‘, ‘ and xx=1 and a3= 4 and a4=3434343 and a5a>99‘]
"‘".join(sarr)
#"select * from a where id=‘?‘ and id1= ‘?‘ and xx=1 and a3= 4 and a4=3434343 and a5a>99"
sql
#"select * from a where id=‘aaaaa haha wocao‘ and id1= ‘fff‘ and xx=1 and a3= 4 and a4=3434343 and a5a>99"

aa = "‘".join(sarr)re.sub(r"\b\d+\b","?",aa)  #"select * from a where id=‘?‘ and id1= ‘?‘ and xx=? and a3= ? and a4=? and a5a>?"
 
时间: 2024-08-28 20:10:45

python正则表达式抽取mysql慢查询sql本身,de-parameterize,将参数值改为?的相关文章

Python全栈 MySQL 数据库 (SQL查询、备份、恢复、授权)

ParisGabriel 每天坚持手写  一天一篇  决定坚持几年 为了梦想为了信仰  开局一张图 今天接着昨天的说 索引有4种: 普通 索引 :index  唯一索引:unique 主键索引:primary key 外键索引:foreign key 索引查询命令: show index from 表名\G: Non_Unique:1   :index Non_Unique:0  :unique 外键索引(foreign key):  定义:让当前字段的值在另一个表的范围内选择   语法:  

在python中连接mysql和查询数据

1 连接mysql import pymysql.cursors# 导入pymysql包# 连接数据库 connection = pymysql.connect(host = "localhost", #host是要连接的数据库的IP地址 user = "eric", #user是登陆的账号名,root是最高权限账号 password = "123456", #user账号的密码 db = "45", #需要连接的数据库 ch

用python脚本导出mysql数据库查询结果到Excel表

最近需要导数据的情况太多,总用跳板机上的navicat工具有点效率低,也觉得挺麻烦的(由于跳板机无法连通外网 所以导出数据文件还得通过sftp传到本机)anyway 还是写个脚本好了.之前写过一个shell脚本做的定时导出任务,现在试试用python写下 主要用到的库有: pymysql -- 连数据库的无需多说os & sys -- 可能回涉及到工作目录或者外部传参xlwt -- 写excel 下面就是代码了,总体还是挺简单的,主要遇到个字符编码的问题,改成utf-8就解决了还有个没解决掉的问

mysql三表查询sql语句

表结构: Student学生表(学号.姓名.性别.年龄.编辑) Course课程表(编号.课程名称) sc选课表(选课编号.学号.课程编号.成绩) (1)写一个SQL语句,查询选修了"计算机原理"的学生学号和姓名 (2)写一个SQL语句,查询"小明"同学选修的课程名称 (3)写一个SQL语句,查询选修了5门课程的学生学号和姓名 答案: (1) select student.stu_no,student.stu_name from student,course,sc

Mysql 分页查询sql优化

SELECT COUNT(id) FROM ts_translation_send_address EXPLAIN SELECT * FROM ts_translation_send_address ORDER BY id LIMIT 2000000,10; SELECT * from ts_translation_send_address t INNER JOIN ( SELECT ID FROM ts_translation_send_address ORDER BY id limit 20

Python全栈 MySQL 数据库 (表字段增、删、改)

ParisGabriel 每天坚持手写  一天一篇  决定坚持几年 为了梦想为了信仰  开局一张图 打字 回车时不小心发布了  正在编辑中.............. 原文地址:https://www.cnblogs.com/ParisGabriel/p/9398614.html

python json及mysql——读取json文件存sql、数据库日期类型转换、终端操纵mysql及python codecs读取大文件问题

preface: 近期帮师兄处理json文件,须要读到数据库里面,以备其兴许从数据库读取数据.数据是关于yelp站点里面的: https://github.com/Yelp/dataset-examples,http://www.yelp.com/dataset_challenge/. 涉及到一些json和sql的问题,记录下. 一.python sql安装 python 自带轻型数据库sqlite,只是用不了.须要mysql才行.pip安装mysql失败.easy_install安装也失败.这

python中的mysql数据库like模糊查询

近期工作在使用python语言开发项目,工作中遇到了一个python连接mysql的like查询. 因为%在python中三个特殊的符号,如%s.%d分别代表了字符串占位符和数字占位符. 大家知道.mysql的模糊查询也须要用到%. 我们有一张test表,要对name字段进行模糊查询,预期的sql例如以下: select * from test where name like '%abc%'; 那么python中怎么写呢? sql = "select * from test where name

在MySQL中使用explain查询SQL的执行计划

1.什么是MySQL执行计划 要对执行计划有个比较好的理解,需要先对MySQL的基础结构及查询基本原理有简单的了解. MySQL本身的功能架构分为三个部分,分别是 应用层.逻辑层.物理层,不只是MySQL ,其他大多数数据库产品都是按这种架构来进行划分的. 应用层,主要负责与客户端进行交互,建立链接,记住链接状态,返回数据,响应请求,这一层是和客户端打交道的. 逻辑层,主要负责查询处理.事务管理等其他数据库功能处理,以查询为例. 首先接收到查询SQL之后,数据库会立即分配一个线程对其进行处理,第