如何在junit测试中测试sql脚本是否符合标准sql?

4

有没有办法用Java/JUnit测试SQL脚本是否包含标准的SQL语句?

目前我们有用于在Postgres数据库中创建数据库等的SQL脚本,但在使用hsqldb时一切都失败了。因此,我想知道是否存在任何Java工具来测试SQL语句是否符合标准SQL。

或者,创建不同的脚本集以适应不同的数据库供应商是否更明智? 如果是这样,是否有一种方法可以测试给定的脚本是否与postgres/hsqldb兼容?


请见 https://dev59.com/RnVC5IYBdhLWcg3w7V73 - martin clayton
在生产和测试中不使用不同的DBMS的另一个好理由是,即使您可以测试SQL查询是否为“标准”SQL,这也并不意味着它在所有DBMS上运行得同样好。没有DBMS实现完整的SQL标准,一些忽略标准定义的规则。 - user330315
6个回答

1

H2数据库支持不同的模式,这对于postgresql测试可能会有所帮助。 我发现我们的sql经常包含H2不支持的函数,但是您可以创建自己的“存储过程”,实际上调用静态Java方法来解决此问题。 如果要支持不同的数据库供应商,则应采用特定于供应商的脚本路线,除非您正在执行基本查询。

如果您有可用资源,我建议设置一个完整的UAT环境,您可以在其中针对实时postgresql数据库进行测试,因为即使看似不重要的db配置差异也可能以意想不到的方式影响查询计划。


0

ZQL 在 Junit 中运行良好。

ZqlParser parser = new ZqlParser(any input stream);
try{
 parser = parser.readStatement();
}catch(ParseException e){
// if sql is not valid it caught here
}

0

我通常会创建一个非常简单的Java Wrapper,通过使用一些标准用户/密码设置和本地主机连接来测试此代码。

请记得使用临时数据库或已知的测试数据库,以便您的测试不会破坏任何重要内容。

上述原因是因为我需要特定的数据库(非标准功能等)。

如果您只想为Junit测试测试标准SQL内容(如语法、选择等),那么我建议在Java中使用嵌入式SQL数据库(通常仅限内存)。这样,可以轻松测试许多内容,而无需安装数据库,并且也不会破坏其他安装。


0

看起来你正在寻找一个SQL语法解析器和验证器。我所熟悉的唯一Java SQL解析器是Zql,但我从未真正使用过它。

类似的问题在去年早些时候被问到过,那里最好的答案是使用ANTLR编写自己的解析器。


0
不同的供应商在他们的SQL实现中公开了不同的附加功能。
您可以决定要测试的数据库集。然后使用http://dbunit.sourceforge.net来简化测试工作。

0

检查SQL语句是否符合标准SQL的最佳工具是HSQLDB 2.0。特别是在数据定义语句方面,这一点尤为重要。HSQLDB是按照标准编写的,而不是在几个版本中采用标准的部分内容。

PostgresSQL已经慢慢向标准SQL靠拢。但它仍然有一些“遗留”的数据类型。HSQLDB允许您使用CREATE TYPE语句定义类型,以便与其他方言兼容。它还允许您定义SQL或Java函数以实现相同的目的。

最好的策略是尽可能使用标准SQL,并使用用户定义的类型和函数来支持替代数据库的语法。


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