0 引言
在数据连接(池)框架、数据服务/Data to API等中间平台中,因部分数据库不允许SQL中存在注释信息(如:Redis、Open Gemini等;当然,MYSQL、INFLUXDB等数据库是支持的),故存在这样一个需求:
- 在提交到数据库的SQL,需对原始SQL的注释信息予以去除。
以 OpenGemini V1.2.0 数据库为例,如果SQL中存在注释信息,将报错:
error parsing query: syntax error : unexpected $unk
1 解决方法
解决思路
基于 Java 的正则表达式进行正则匹配,是最佳选择。
SqlCommentStripper
import java.util.regex.Pattern;/*** SQL注释剥离器* @author johnny zen* @create-time 2024-08-12 14:35* @note ...*/
public class SqlCommentStripper {private static final Pattern SINGLE_LINE_COMMENT_PATTERN = Pattern.compile("--.*?\n", Pattern.DOTALL);private static final Pattern MULTI_LINE_COMMENT_PATTERN = Pattern.compile("/\\*.*?\\*/", Pattern.DOTALL);/*** 自动去除注释* @param sql* @return*/public static String stripComments(String sql) {//eg: sql = "SELECT * FROM users WHERE id = 1; -- This is a single-line comment\n/* Hello Guys \nThis is a multi-line comment! */";String cleanSql = SINGLE_LINE_COMMENT_PATTERN.matcher(sql).replaceAll("");cleanSql = MULTI_LINE_COMMENT_PATTERN.matcher(cleanSql).replaceAll("");return cleanSql;//eg : SELECT * FROM users WHERE id = 1;}
}
X 参考文献
- GPT
- opgen gemini
- https://docs.opengemini.org/zh/guide/quick_start/get_started.html
- influxdb
- https://docs.influxdata.com/influxdb/v1/about_the_project/release-notes