我的博客
在看到這個標題時候肯定有人會想,我寫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)
執行結果見截圖

效果和預想的結果一樣,注釋去除的干干凈凈
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/507141.html
標籤:Python
