用python去除SQL中的注释

我的博客
在看到这个标题时候肯定有人会想,我写SQL直接在数据库工具上执行就行了啊,工具会自动识别注释的,就是不用工具,把SQL写到存储过程里,数据库也会识别注释不执行的,干嘛非要去掉,费力不讨好。

其实是最近在做一个项目,需要在行云库里执行SQL,并且SQL是写在脚本上的,通过JDBC调用,众所周知,SQL的注释很随意,甚至有什么保佑不出bug这种,那么执行的时候就很有可能因为注释里的特殊字符导致一堆莫名其妙的bug出现,并且行云数据库是一个国产的不太完善的数据库,所以本身对特殊字符的支持也不是很好,所以去除注释势在必行。

好了,废话说的够多了,现在上代码,因为行注释和段落注释使用的注释方法不同,所以这里分成两个功能来写

去除行注释
说明:因为行注释是从--开始一直到结尾都算行注释,所以一个正则就可以搞定了
def rehint_line(sql_values):
  rev = re.compile('--.*\\n?')
  sql_values = re.sub(rev,'\n',sql_values)
  return sql_values

行注释看起来还是比较简单的,其实我也没想到会这么简单,哈哈哈哈哈

去除段注释
'''
说明:
  1、在读取SQL的时候需要一次全部读出来,然后赋值给变量
  2、迭代读取SQL中的每一个字符,并且把字符写到新的变量里
  3、如果遇到/或*就记录下,例如给变量v
  4、当遇到/之后,紧跟着下一个字符是*,那就停止把字符写到变量,直到遇到*之后紧跟着下一个字符是/
'''
def rehint_limit(sql_values):
  write_tag = 0 # 用来控制是否写入新变量
  write_limit = '' # 记录/或者*
  sql_result = '' # 记录去除注释后的结果
  for case in sql_values:
    if (write_limit + case) == '/*':
      sql_result = sql_result.strip('/') # 去除最后一个/
      write_tag += 1
    if write_tag == 0:
      sql_result += case
    if (write_limit + case) == '*/':
      write_tag -= 1
    write_limit = ''
    if '/' == case or '*' == case:
      write_limit = case
  return sql_result

恩,段注释有一些麻烦,不过还好,我写说明了,如果大家有更好更有效率的办法欢迎提供

下面试下效果,把下面代码存成rehint.py,或者你想存成别的也行,名字随意啦

#!/usr/bin/python
coding: utf-8

import re

def rehint_limit(sql_values):
  write_tag = 0 # 用来控制是否写入新变量
  write_limit = '' # 记录/或者*
  sql_result = '' # 记录去除注释后的结果
  for case in sql_values:
    if (write_limit + case) == '/*':
      sql_result = sql_result.strip('/') # 去除最后一个/
      write_tag += 1
    if write_tag == 0:
      sql_result += case
    if (write_limit + case) == '*/':
      write_tag -= 1
    write_limit = ''
    if '/' == case or '*' == case:
      write_limit = case
  return sql_result

def rehint_line(sql_values):
  rev = re.compile('--.*\\n?')
  sql_values = re.sub(rev,'\n',sql_values)
  return sql_values

if __name__ == '__main__':
  sql = '''
--这是个sql
select '1' v1,'2' v2 from dual union all
select '2' v1,'3' v2 from dual union all
/* 这段select 1 v1,2 v2 from dual union all
select 2 v1,3 v2 from dual 写错了
*/
select /* 这个是select语句 */ 'a' v1, --v1列
       'b' v2 --v2列
from dual --dual是个伪表
'''
  print(sql)
  # 先去除段注释
  sql = rehint_limit(sql)
  print('rehint_limit: ' + sql)
  # 去除行注释
  sql = rehint_line(sql)
  print('rehint_line: ' + sql)

执行结果见截图

用python去除SQL中的注释

效果和预想的结果一样,注释去除的干干净净

Original: https://www.cnblogs.com/xiu123/p/16691503.html
Author: 咻_python
Title: 用python去除SQL中的注释

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/578157/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • SpringBoot + Vue + ElementUI 实现后台管理系统模板 — 后端篇(二): 整合 Redis(常用工具类、缓存)、整合邮件发送功能

    (1) 相关博文地址: SpringBoot + Vue + ElementUI 实现后台管理系统模板 — 前端篇(一):搭建基本环境:https://www.cnblogs.c…

    Linux 2023年6月11日
    0113
  • 【论文笔记】(2017,BIM)Adversarial Machine Learning at Scale

    本文主要是给出了两类多个对抗攻击方法:one-step 攻击和 multi-step 攻击,并在大型模型和大型数据集上对这些方法进行对比实验,实验结果发现使用 one-step 样…

    Linux 2023年6月7日
    091
  • NoteOfMySQL-08-视图

    视图是从一个表或多个表中导出的表,是一种虚拟存在的表,不占用存储空间。视图可以使用户的操作更方便,并且可以保障数据库系统安全性。 1. 视图概述 视图中保存的仅仅是一条select…

    Linux 2023年6月14日
    087
  • SSH免密登录

    SSH免密登录实现三步: 客户端生成公钥和私钥 上传公钥到服务端 SSH免密登录 (1) 客户端生成和公钥和私钥 ssh-keygen 一路回车即可,默认会在~/.ssh/目录下创…

    Linux 2023年6月7日
    0101
  • Kubernetes 安装Redis集群

    一、Operator 以集群模式安装 可以在service_account和 operator后面加-n 参数指定namespace 这个yaml文件中使用的资源较高,测试环境可能…

    Linux 2023年5月28日
    074
  • [python] boss直聘自动搜索简历聊天HR机器人

    前言 1、首先进行几个关键位置的标定 2、拖拽鼠标复制简历的文字,并进行字符串匹配,对候选人进行人物画像和打分 3、筛选、聊天、下一个全流程状态机 附录 前言 该机器人完全仿照人是…

    Linux 2023年6月8日
    0231
  • shell内置命令和外部命令的区别

    shell内置命令和外部命令的区别 内部命令实际上是shell程序的一部分,其中包含的是一些比较简单的linux系统命令,这些命令由shell程序识别并在shell程序内部完成运行…

    Linux 2023年6月7日
    083
  • python爬虫_入门

    本来觉得没什么可写的,因为网上这玩意一搜一大把,不过爬虫毕竟是python的一个大亮点,不说说感觉对不起这玩意基础点来说,python2写爬虫重点需要两个模块,urllib和url…

    Linux 2023年6月6日
    091
  • JavaScript闭包

    <!doctype html> <html lang="en"> <head> <title>&#x95…

    Linux 2023年6月13日
    083
  • redis研究记录

    redis研究记录 1 概述目前多数的NoSql数据库本质上都是键值对形式,Redis也不例外。作为缓存数据库的一种,和Memcached相比,有以下几种主要的优点:(1)速度上,…

    Linux 2023年5月28日
    081
  • final关键字

    1-1 编译期常量 定义:带有 ①编译时数值(区别于运行时数值)的 ②final ③ 基本数据类型的量。 注意: 既是static又是final的量不一定是编译期常量; publi…

    Linux 2023年6月8日
    080
  • cmake 入门笔记

    1. cmake 是什么? 这些年大型 C/C++ 工程都纷纷转到了 cmake 环境下,那么这个工具到底有什么魅力吸引着大家呢?无它,软件工程崇尚实用主义,而 cmake 的功能…

    Linux 2023年6月6日
    0111
  • MySQL安装和配置

    一、关闭防火墙并安装epel源 1、关闭selinux ①修改selinux的配置文件 [root@localhost ~]# vim /etc/selinux/config SE…

    Linux 2023年6月7日
    091
  • openssh升级

    bash;gutter:false; ssh -V</p> <p>cp -a /etc/ssh/sshd_config /etc/ssh/sshd_conf…

    Linux 2023年6月7日
    085
  • list底层实现

    list和vector都是容器,只不过他们的存储结构不同,vector实际底层结构是顺序表,支持随机访问。list的底层结构带头双向链表,不支持随机访问。 但list的底层实现不同…

    Linux 2023年6月13日
    0109
  • 会计学包含的两种程序设计思想

    下班路上坐地铁的时候看了一本会计学的书,目前看了50多页。过程中,发现会计学和程序设计在思想上有惊人的相似之处。今天举两个例子做说明。 CR设计和账簿 CR设计介绍 CR设计就是只…

    Linux 2023年6月14日
    084
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球