有没有任何Java库可以验证SQL语法?

26

我不确定这个功能是否存在,所以我想借助他人的智慧来解决问题。

我想知道是否有任何Java库可以用于验证SQL查询语句的语法。我知道有许多与常见SQL规范的偏差,因此它可能只适用于类似于SQL:2006的内容,但这肯定足够了。

我的目标是将其用于单元测试,而不需要尝试执行针对数据库的查询。我知道它的使用受到限制,但仍然有用。

谢谢!


您需要验证特定厂商的 SQL 还是标准 ANSI SQL?所有主要的 SQL DBMS 厂商在扩展和同时未能充分实现标准时都与标准明显不同。 - Constantin
1
这个问题为什么不够具体? - rtcarlson
@awied,你有没有找到一个好的解决方案? - mdewit
很久以前的事了,所以我不确定,但如果我记得正确的话,我认为我没有找到符合我的需求的东西。抱歉。 - awied
7个回答

10
也许你可以使用Antlr,它有许多SQL语法和一个Java库, 同时还有适用于各种Java IDE的插件。
或者如建议的那样,使用开源SQL实用程序的解析器,例如SQuirreL SQL Client

6

不错的工具,但不是免费的。 - Tokazio

5

试试JSQL解析器

除了验证外,您还可以获得查询的有意义的表示。
这使您可以仅接受“特定”命令;操作查询,“美化”它等。


我认为这个项目已经迁移到了Github:https://github.com/JSQLParser/JSqlParser - Sebastien
验证示例:https://github.com/JSQLParser/JSqlParser/wiki/Examples-of-SQL-Validation - motte

4
我认为并没有这样的库。SQL语法有太多的派生。
一个可能的解决方案是使用开源的纯Java DBMS的部分,例如SmallSQL。在此项目中,您可以创建SQLParser的实例。需要连接的引用可以非常容易地删除。

你是不是一个SmallSQL开发者? - Constantin
是的,我是其中一位开发者。 - Horcrux7
@Horcrux7:我刚刚下载了SmallSQL。看起来删除SSConnection引用并不容易。似乎SQLParser通过检查实际的数据库模式来验证SQL语法(例如,SQLParser.from()方法尝试连接到数据库)。 - Sam Goldberg
如果您无法删除引用,则可以将其替换为自己的安慰剂实现。您想要解析的语法必须还具有名称模式。 - Horcrux7
Apache Calcite现在已经存在(始于2014年),它正好做到了OP在2008年所要求的。 - Guillaume Massé

1

你也许可以从 Java 和开源项目 HSQL 中提取出解析代码。


1

-1

使用JOOQ,您将永远不会在SQL中犯错误。Java编译器会为此负责。


1
如果您只是将JOOQ用作查询构建器,那么是否有JOOQ机制来验证生成的SQL(例如在Junit测试中)? - hovanessyan
@hovanessyan 我认为没有必要验证它们,因为 JOOQ 会生成有效的 SQL。 - Vladislav Rastrusny
JOOQ允许您自己编写SQL语句,因此如果您错过了逗号、括号或其他内容,则SQL将无效。如果您使用生成的模型类,JOOQ会发出有效的SQL - 我只是将其用作SQL构建器,而不依赖于模型生成 - 因此可能会生成无效的SQL。 - hovanessyan
@hovanessyan 确实。我认为你可以尝试准备查询来测试其有效性。这需要一个活动的数据库连接,但是如果查询准备得好,你可以99.9%确定它的语法是正确的。 - Vladislav Rastrusny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接