用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中的注释

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

 

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:用python去除SQL中的注释 - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日

相关文章

  • python写脚本测试执行为什么要写if __name__ == ‘__main__’

    我的博客 在写python脚本的时候,例如,我写一个test1.py def test(n): print(n) if __name__ == ‘__main__’: n = 1 test(1) 接下来打开cmd命令窗口,执行命令 python test.py 结果是把1打印出来 这时候就会有同学有疑问了,我直接写不行么,在test1.py的同一个目录下创建…

    2023年4月2日
    00
  • 已安装python在cmd命令窗口执行python提示“’python’ 不是内部或外部命令,也不是可运行的程序”

    我的博客 这个教程只适合windows,linux不适用,不过话说回来了,linux都是自带python的,所以已经预置好了,只要打python就行了,根本不用加环境变量 言归正传 写了好长时间的python,最近发现个很基础的问题,就是很多同学已经安装python了,但是不知道怎么运行,找了教程,也是在cmd命令窗口执行python [python脚本]就…

    2023年4月2日
    00
  • python的日期处理

    我的博客 俗话说,工欲善其事必先利其器,所以在使用日期前要先对日期进行处理,所以时间戳和字符串的来回来去转换这个事肯定是要搞的 这次的函数有一个?有两个?有三个?有四个!上代码! 哈哈,像不像直播带货 本次用到3个内置包 import reimport timeimport calendar 第一个,日期转时间戳 # 日期字符串转时间戳 def str_ti…

    Python开发 2023年4月2日
    00
  • python接收微信消息报’HTMLParser’ object has no attribute ‘unescape’错误

    我的博客 一直有个想法,想要弄个微信机器人,然而出师不利,刚开始就碰壁了 先上代码,这个是用来接收消息的,是个测试脚本 #!/usr/bin/python # coding: utf-8 import itchat def write_infomation(text_value): print(text_value) @itchat.msg_register…

    2023年4月2日
    00
  • django 报错 ‘set’ object is not reversible 解决

    我的博客 这个问题在网上随便一搜就有解决办法,说是把urls.py里面的urlpatterns = 这部分的{}改成[]就可以了,想想也对,毕竟里面是个list也不是个dict 先说下我的project内容 我用的命令是 python manage.py startproject myweb python manage.py startapp app1 py…

    Python开发 2023年4月2日
    00
  • python的django写页面上传文件以及遇到的问题

    首先上结构 mynode -> app5 -> urls.py & views.py             | -> templates -> 5 -> upload.html             | -> mynode -> urls.py             | -> media 按照顺序…

    2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部