将日志打印的SQL组装为可执行SQL_sublime版

2023-10-27

java项目日志打印的sql和条件参数是分离的,使用起来很不方便,之前为了解决这种问题,使用notepad++录制宏解决了这个问题,但是后期不方便维护,遂转用sublime,这个跟notepad++比起来有些东西不是很习惯,但是好处是插件可以自己写,确实方便了很多,直接上代码,至于怎么安装,大家还是百度吧

直接上代码,注释写的很清楚,这里就不解释了


# 将java项目生成的sql改为可执行sql
class FillsqlCommand(sublime_plugin.TextCommand):
	def run (self,edit): 

		reg,source_str,lineBreak = getSel(self.view)  
		# 将==>和Parameters之间的空字符串删除,以免后面的匹配出问题
		source_str = re.sub("==>\s*Parameters:", "==>Parameters:", source_str)

		# 第一次出现的<==会包含完整的source_str以及参数信息,或是全没有这些信息,这正是符合我们预期
		# 每次将一份数据取出放到cut_str里面,同时source_str变量也要减去cut_str的数据,直接source_str消费干净为止
		cut_str = source_str[ :source_str.find("<==")]
		source_str = source_str[source_str.find("<==")+len("<=="):]

		result = ""
		while(len(cut_str.strip())!= 0):
			# 查询sql位于 preparing和parameters之间
			start_str = "Preparing:"
			statement_start_index = cut_str.find(start_str)
			if(statement_start_index ==  -1):
				# 我这里主要是查询sql,写这个也是为了兼容有些人没有复制preparing导致配不上的问题
				start_str = "SELECT"
				statement_start_index = cut_str.find(start_str)
				if (statement_start_index == -1):
					break
			statement_start_index = statement_start_index+len(start_str)

			end_str = "==>Parameters:"
			# 没找到查询sql说明后面的数据没有价值了,直接跳出循环
			if cut_str.find(end_str) == -1:
				break

			statement_end_index = cut_str.find(end_str) 

			preparing_sql = cut_str[statement_start_index:statement_end_index]

			# 查询条件位于 Parameters 和<==之间  
			parameter_sql = cut_str[statement_end_index+len(end_str):cut_str.find("<==")]

			# 条件为空时,就说明数据少了,就结束循环
			if(parameter_sql.strip() is None):
				break
			# parameter_sql 格式为  1(String),2(Integer)  我们需要根据类型决定条件里面的参数要加引号还是不加,虽然统一加引号,mysql也是可以隐匿转换
			parameter_list = parameter_sql.split(",")

			for index in range(len(parameter_list)):
				param_sub_list = parameter_list[index].split("(")
				param_prefix = param_sub_list[0]
				if(len(param_sub_list) == 2):
					param_suffix = param_sub_list[1].replace(")","")
					# 这里用了一个取巧方式可以少写很多if elif
					if param_suffix in "String,LocalDate,Date,TimeStamp":
						param_prefix = "\"" +param_prefix.strip()+ "\""

				# 每次只替换一个问号字符
				preparing_sql = preparing_sql.replace("?",param_prefix,1)

			result += preparing_sql.replace("\n",";")
			result += "\n\n===============================>\n\n"

			# 找不到有效数据就退出 循环
			if(source_str.find("<==") == -1):
				break
			cut_str = source_str[:source_str.find("<==")]
			source_str = source_str[source_str.find("<==") + len("<=="):]


		# 有数据时才刷到view里面
		if len(result) != 0:
			self.view.replace(edit,reg,result)


 

从项目里面拿的测试文本

Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6911a3c2] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@739455108 wrapping com.mysql.cj.jdbc.ConnectionImpl@32f1afc4] will not be managed by Spring
==>  Preparing: SELECT max(biz_date) as biz_date FROM ttbi_order_hf WHERE (biz_date >= ? AND biz_date <= ?) GROUP BY null
==> Parameters: 2022-05-22(LocalDate), 2022-08-26(LocalDate)
<==      Total: 0
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6911a3c2]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1df5f8a3] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@2040416108 wrapping com.mysql.cj.jdbc.ConnectionImpl@32f1afc4] will not be managed by Spring
==>  Preparing: select biz_date,round(sum(fz) /sum(fm),7) as dataNumber from ( select biz_date,recom_type_code, case when recom_type_code in ( ? , ? ) then sum(bigorder_new_1w) else 0 end as fz, sum(bigorder_new_1w) as fm from ttbi_order_hf WHERE biz_date in ( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? ) group by biz_date,recom_type_code ) t1 group by biz_date order by biz_date asc
==> Parameters: 1(String), 2(String), 2022-05-22(String), 2022-05-29(String), 2022-06-05(String), 2022-06-12(String), 2022-06-19(String), 2022-06-26(String), 2022-07-03(String), 2022-07-10(String), 2022-07-17(String), 2022-07-24(String), 2022-07-31(String), 2022-08-07(String), 2022-08-14(String), 2022-08-21(String), 2022-08-26(String), null
<==      Total: 0
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1df5f8a3]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7eed8a78] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@332896599 wrapping com.mysql.cj.jdbc.ConnectionImpl@32f1afc4] will not be managed by Spring
==>  Preparing: select code,name,parent_code,category_code,is_delete as isDeleted from t_conf_info WHERE is_delete = 0 and category_code in ( ? ) and code in ( ? , ? ) order by category_code,code
==> Parameters: car_type(String), 2(String), 7(String)
<==    Columns: code, name, parent_code, category_code, isDeleted
<==        Row: 2, WE86, , car_type, 0
<==      Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7eed8a78]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@613de06a] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@1476495627 wrapping com.mysql.cj.jdbc.ConnectionImpl@32f1afc4] will not be managed by Spring
==>  Preparing: SELECT max(biz_date) biz_date FROM ttbi_order_hf GROUP BY null
==> Parameters: 
<==      Total: 0
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@613de06a]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7e864b7c] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@1416401560 wrapping com.mysql.cj.jdbc.ConnectionImpl@32f1afc4] will not be managed by Spring
==>  Preparing: SELECT biz_date,sum(bigorder_add_1y) as dataNum,car_type FROM ttbi_order_hf WHERE (car_type IN (?,?) AND biz_date IN (?,?)) GROUP BY biz_date,car_type order BY biz_date ASC
==> Parameters: 2(String), 7(String), 2022-08-26(LocalDate), null
<==      Total: 0
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7e864b7c]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1347aa58] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@1586936640 wrapping com.mysql.cj.jdbc.ConnectionImpl@32f1afc4] will not be managed by Spring
==>  Preparing: SELECT max(biz_date) biz_date FROM ttbi_order_hf GROUP BY null
==> Parameters: 
<==      Total: 0
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1347aa58]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5a78eec9] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@1950587572 wrapping com.mysql.cj.jdbc.ConnectionImpl@32f1afc4] will not be managed by Spring
==>  Preparing: SELECT biz_date,sum(bigorder_add_1y) as dataNum FROM ttbi_order_hf WHERE (biz_date IN (?,?)) GROUP BY biz_date order BY biz_date ASC
==> Parameters: 2022-08-26(LocalDate), null
<==      Total: 0
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5a78eec9]

效果图

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将日志打印的SQL组装为可执行SQL_sublime版 的相关文章

随机推荐

  • PHP获取当前系统时间戳(精确到毫秒,微秒)

    推荐 小程序版系统后台快速开发 推荐一个实时新闻接口 适合做新闻类APP 网站 小程序等 获取当前系统时间 精确到毫秒 return float function getMillisecond list t1 t2 explode micr
  • Yii Framework 开发教程(46) Zii组件-Sortable示例

    CJuiSortable显示一个列表 列表中的列表项可以通过拖放重新调整顺序 它封装了 JUI Sortable插件 其基本用法如下 php view plain copy print
  • ViewPager + TabLayout + Fragment 切换崩溃

    使用ViewPager TabLayout Fragment三件套来进行界面切换 刚开始只有两个fragment需要切换 一切正常 然后增加了一个fragment 切换前两个就正常 切换第三个然后想切换回第一个就崩溃了 原因是ViewPag
  • textarea随输入文本增加,其高度自动加大

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 首先给出答案
  • GPU硬件结构和编程模型(源于nvidia的CUDA文档)

    GPU的硬件结构 GPU通过一个可扩展的多线程流式多处理器 SMs 构建 一个multiprocessor可以在同一时间处理上百个线程 为了管理这些线程 使用一个特殊的结构SIMT 利用单线程中指令级的并行 以及同步硬件多线程实现的广泛线程
  • 解决“volar.inlayHints.eventArgumentInInlineHandlers“: false` to hide Event Argument in Inline Handl

    今天遇到了一个很奇怪的问题 解决办法 在vscode中点击设置 在搜索框中输入eventArgumentInInlineHandlers 关闭红色框中的对号即可
  • 避免同一文件多次被include

    转载 url http c chinaitlab com cc basic 200805 748036 html url 为了避免同一个文件被include多次 C C 中有两种方式 一种是 ifndef方式 一种是 pragma once
  • rsync报错

    1 skipping non regular file 原因 源文件中存在软链接 解决办法 使用 a选项 2 skipping directory 原因 源文件中存在目录 默认rsync只同步文件 解决办法 使用 r选项
  • Win7和Win10 关闭驱动程序强制签名的方法

    随着windows的更新 微软对驱动签名的邀请越来越严格 Windows 10 1607以后的内核驱动没有微软签名都不能正常运行 建议大家将自己开发的驱动进行微软徽标认证 WHQL认证 以获取微软驱动签名 下面为大家介绍windows 7和
  • 拳王虚拟项目公社:淘宝虚拟货源怎么找?在哪里找虚拟资源,虚拟产品如何找到?

    淘宝的虚拟货源从哪来 卖家要知道虚拟产品有什么技巧 很多小伙伴开店开站卖的是虚拟产品 为什么新手更愿意选择虚拟产品开店呢 因为 虚拟店铺的成本非常低 利润却很高 相对于非虚拟的店铺 虚拟店铺是非常具有优势的 不过 在货源选择方面 大家同样要
  • 服务器被攻击怎么选择更好的方式去防御,IDC说的集防和单机防御都是什么意思

    只要是互联网覆盖到的地方 或多或少都会存在有网络攻击的情况 一但面对网络攻击 很有可能会出现服务器瘫痪业务无法正常进展的情况 那边怎么才能消除网络攻击的影响呢 那就是考虑接入使用高防服务器来抵挡网络攻击 高防服务器之所以称之为高防 是因为服
  • MyBatis动态SQL,foreach下批量插入

    MyBatis批量插入 mapper接口 mapping映射 测试 jdbc properties mapper接口 int forEachInsert Param list List
  • STATA基础笔记

    1 generate 可简化为 g ge gen help 简 h 2 变量也可简化 比如country 就用c 表示 前提是其他变量开头不带c 3 变量可以使用通配符 c 代表所有以c为首字母的变量 4 do文件 用来记录命令 log文件
  • 撸狗初体验

    直接上视频听我 BB https www bilibili com video av75675708 下面开始编故事 某个周末 走在去加班的路上 脚底突然被某个东西咯噔一下 抬脚一看 竟然是 捡起来一看 哈士奇 哈士奇 哈士奇 竟然是 DF
  • 编程中,有哪些好的习惯一开始就值得坚持?

    嗨 小伙伴们大家好 我是沉默王二 就是那个吹自己既有颜值又有才华的家伙 今天这个话题我觉得还是值得和大家探讨的 因为好的编程习惯对程序员的职业生涯真的非常重要 记得我在学驾照的时候 遇到一哥们 之前开过车 属于无证驾驶的那种 但是 这哥们科
  • 一键部署WeBase-FISCO-BCOS联盟链管理平台

    文章目录 一键部署 前置条件 实际使用环境 一 环境安装 ubuntu18 04 1 Java安装及环境变量配置 2 Mysql的安装及配置 3 python配置 PyMySQL部署 Python3 4 二 拉取webase部署脚本 修改w
  • PageHelper 分页查询「实现篇」

    两种情况 分两种情况 查出来为 PageQueryRespDTO 查出来直接是 Model 查出来为 PageQueryRespDTO public PageInfo
  • WS-Discovery(网络服务动态发现)协议再解读

    WS Discovery 网络服务动态发现 协议再解读 文章目录 WS Discovery 网络服务动态发现 协议再解读 1 概述 2 协议资料 3 协议介绍 1 适用范围 2 不适用 4 协议示例及wireshark抓包分析 1 客户端探
  • html想相关概念

    HTML Hypertext Markup Language 是一种用于创建网页的标记语言 它为开发者提供了一种结构化的方式来描述网页的内容和外观 本文将介绍HTML的基础知识和关键点 让读者了解如何使用HTML来构建现代网页 HTML的基
  • 将日志打印的SQL组装为可执行SQL_sublime版

    java项目日志打印的sql和条件参数是分离的 使用起来很不方便 之前为了解决这种问题 使用notepad 录制宏解决了这个问题 但是后期不方便维护 遂转用sublime 这个跟notepad 比起来有些东西不是很习惯 但是好处是插件可以自