2010-08-25 116 views
4

有什么方法可以测试SQL脚本是否包含java/junit测试的标准SQL?如何测试sql脚本是junit测试中的标准sql?

目前我们有用于在Postgres数据库中创建数据库等的SQL脚本,但是当使用hsqldb时,一切都会失败。这就是为什么我想知道是否有任何Java工具存在用于测试,如果SQL语句是标准的SQL。

或者为每个数据库供应商创建不同的脚本集合是否明智? 如果是这样,有没有一种方法来测试一个给定的脚本是否适用于postgres/hsqldb?

+0

见http://stackoverflow.com/questions/141499/any-java-libraries-out-there-that-validate-sql-syntax – 2010-08-25 08:27:07

+0

感谢链接! – kosoant 2010-08-25 09:01:22

+0

另一个很好的理由,**不**在生产和测试中使用不同的DBMS。即使_if_你可以测试一个SQL查询是“标准”的SQL,并不意味着它可以在所有DBMS上同样运行。没有DBMS实现完整的SQL标准,有些忽略标准定义的规则。 – 2016-01-06 19:28:31

回答

0

我通常做了一个非常简单的java包装,通过使用带有一些标准用户/密码设置的本地主机连接来测试此代码 。

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

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

如果你只想测试junit测试的标准sql-stuff(如语法,选择等), 我会考虑在java中使用嵌入式sql数据库(仅限ususally memory)。 这样就可以很容易地测试大量的东西,而无需安装db ,而且没有任何其他安装的风险。

1

H2数据库支持不同的modes,它可以帮助您进行postgres测试,我发现我们的sql通常包含不支持但H2的函数,但您可以创建自己的“存储过程”,它实际上调用静态Java方法来解决这个问题。如果你想支持不同的数据库供应商,你应该遵循供应商特定的脚本路线,除非你正在做基本的查询。

如果您有可用资源,我建议您设置一个完全成熟的UAT环境,您可以使用它来测试实时postgres数据库,因为即使看起来很小的数据库配置差异也会以意想不到的方式影响查询计划。

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,用户定义的类型和函数支持替代数据库的语法。

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 
}