【问题标题】:How to test sql scripts are standard sql in junit tests?如何测试 sql 脚本是 junit 测试中的标准 sql?
【发布时间】:2011-04-03 14:13:42
【问题描述】:

有什么方法可以通过 java/junit 测试来测试 SQL 脚本是否包含标准 SQL?

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

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

【问题讨论】:

  • 另一个在生产和测试中使用不同 DBMS 的好理由。甚至 if 您也可以测试 SQL 查询是否是“标准”SQL,但这并不意味着它在所有 DBMS 上运行得一样好。没有 DBMS 实现完整的 SQL 标准,一些忽略标准定义的规则。

标签: java postgresql junit hsqldb sql-standards


【解决方案1】:

不同的供应商在其 SQL 实现中公开了不同的附加功能。

您可以决定要测试的数据库集。然后使用http://dbunit.sourceforge.net 来简化测试工作。

【讨论】:

    【解决方案2】:

    ZQL 与 Junit 配合得很好..

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

    【讨论】:

      【解决方案3】:

      检查 SQL 语句是否符合标准 SQL 的最佳工具是 HSQLDB 2.0。对于数据定义语句尤其如此。 HSQLDB 已写入标准,而不是在多个版本中采用标准的部分内容。

      PostgresSQL 一直在缓慢地向标准 SQL 迈进。但它仍然有一些“遗留”数据类型。 HSQLDB 允许您使用 CREATE TYPE 语句定义类型以与其他方言兼容。它还允许您出于相同目的在 SQL 或 Java 中定义函数。

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

      【讨论】:

        【解决方案4】:

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

        去年年初有人问过一个类似的问题,结果证明最好的答案是使用ANTLR编写自己的解析器。

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

            我通常会制作一个非常简单的 java-wrapper 来测试这段代码 通过使用带有一些标准用户/密码设置的 localhost 连接。

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

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

            如果您只想为 junit 测试(如语法、选择等)测试标准 sql-stuff, 我会考虑在java中使用嵌入式sql数据库(通常仅限内存)。 这样就可以轻松测试很多东西而无需安装数据库 也没有损坏其他装置的风险。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-09-30
              • 2011-04-17
              • 2019-08-06
              • 1970-01-01
              • 2019-04-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多