有没有办法用Java/JUnit测试SQL脚本是否包含标准的SQL语句?
目前我们有用于在Postgres数据库中创建数据库等的SQL脚本,但在使用hsqldb时一切都失败了。因此,我想知道是否存在任何Java工具来测试SQL语句是否符合标准SQL。
或者,创建不同的脚本集以适应不同的数据库供应商是否更明智? 如果是这样,是否有一种方法可以测试给定的脚本是否与postgres/hsqldb兼容?
有没有办法用Java/JUnit测试SQL脚本是否包含标准的SQL语句?
目前我们有用于在Postgres数据库中创建数据库等的SQL脚本,但在使用hsqldb时一切都失败了。因此,我想知道是否存在任何Java工具来测试SQL语句是否符合标准SQL。
或者,创建不同的脚本集以适应不同的数据库供应商是否更明智? 如果是这样,是否有一种方法可以测试给定的脚本是否与postgres/hsqldb兼容?
H2数据库支持不同的模式,这对于postgresql测试可能会有所帮助。 我发现我们的sql经常包含H2不支持的函数,但是您可以创建自己的“存储过程”,实际上调用静态Java方法来解决此问题。 如果要支持不同的数据库供应商,则应采用特定于供应商的脚本路线,除非您正在执行基本查询。
如果您有可用资源,我建议设置一个完整的UAT环境,您可以在其中针对实时postgresql数据库进行测试,因为即使看似不重要的db配置差异也可能以意想不到的方式影响查询计划。
ZQL 在 Junit 中运行良好。
ZqlParser parser = new ZqlParser(any input stream);
try{
parser = parser.readStatement();
}catch(ParseException e){
// if sql is not valid it caught here
}
我通常会创建一个非常简单的Java Wrapper,通过使用一些标准用户/密码设置和本地主机连接来测试此代码。
请记得使用临时数据库或已知的测试数据库,以便您的测试不会破坏任何重要内容。
上述原因是因为我需要特定的数据库(非标准功能等)。
如果您只想为Junit测试测试标准SQL内容(如语法、选择等),那么我建议在Java中使用嵌入式SQL数据库(通常仅限内存)。这样,可以轻松测试许多内容,而无需安装数据库,并且也不会破坏其他安装。
看起来你正在寻找一个SQL语法解析器和验证器。我所熟悉的唯一Java SQL解析器是Zql,但我从未真正使用过它。
类似的问题在去年早些时候被问到过,那里最好的答案是使用ANTLR编写自己的解析器。
检查SQL语句是否符合标准SQL的最佳工具是HSQLDB 2.0。特别是在数据定义语句方面,这一点尤为重要。HSQLDB是按照标准编写的,而不是在几个版本中采用标准的部分内容。
PostgresSQL已经慢慢向标准SQL靠拢。但它仍然有一些“遗留”的数据类型。HSQLDB允许您使用CREATE TYPE语句定义类型,以便与其他方言兼容。它还允许您定义SQL或Java函数以实现相同的目的。
最好的策略是尽可能使用标准SQL,并使用用户定义的类型和函数来支持替代数据库的语法。