【问题标题】:H2: generate insert scripts initialization scriptH2:生成插入脚本初始化脚本
【发布时间】:2017-04-27 09:51:18
【问题描述】:

我有完整的 h2 数据库,其中包含大量数据。我想针对该数据启动集成测试。

问题1: 是否可以从完整的 h2 数据库生成 *.sql 插入文件/脚本?

我已经按照here 的描述尝试了SCRIPT TO 'fileName'。但它只生成CREATE/ALTER TABLE/CONSTRAINT 查询,意味着创建没有数据的架构。

如果第一个问题的答案是 - “不可能”,那么:

问题 2: *.sql 插入文件是将初始数据集插入 h2 db 以进行集成测试的唯一方法吗?

【问题讨论】:

  • @Berger 如果我错了,请纠正我,但该参考是关于使用嵌入式 h2 配置 Spring。他们使用db/sql/insert-data.sql 脚本来初始化数据。我的问题是关于如何从现有数据库自动创建 db/sql/insert-data.sql 脚​​本
  • 如果你使用 DBUnit,你可以注入你可以从你自己的查询中创建的数据集。我在这篇文章中讨论它:*.com/questions/40884098/…
  • @davidxxx 我可以在没有 DBUnit 的情况下使用纯 sql 注入初始数据。问题是数据集很大,我至少要花几天时间来描述init数据集。
  • 用 DBunit 生成 init 数据集不是一种选择?
  • @davidxxx 使用 DBUnit 有什么好处?这意味着编写相同的脚本,但我将获得 xml,而不是众所周知的 sql 语法。我将在测试中使用 init.sql 脚本和 Spring 的 \@Transactional 注释。而且DBUnit也有一些缺点,可以看*.com/questions/3950002/…

标签: java spring integration-testing h2 spring-test


【解决方案1】:

问题1:是否可以生成 *.sql 插入文件/脚本 完整的 h2 数据库?

我刚刚使用我的一个 H2 文件数据库进行了测试,结果导出同时导出了结构和数据。
我使用 H2 的 1.4.193version 进行了测试。

导出作品的两种方式:

  • 来自 H2 控制台的 SCRIPT 命令
  • org.h2.tools.Script 命令行工具。

1) 我首先测试了org.h2.tools.Script 工具,因为我已经使用过它。

这是导出结构和数据的最小命令:

java -cp <whereFoundYourH2Jar> org.h2.tools.Script -url <url> 
     -user <user> -password <password>

地点:

  • &lt;whereFoundYourH2Jar&gt; 是您拥有 h2.jar 库的类路径(我使用的是我的 m2 存储库)。
  • &lt;url&gt; 是您的数据库的网址
  • &lt;user&gt;是数据库的用户
  • &lt;password&gt;数据库密码

您在org.h2.tools.Script工具的官方帮助中有更多详细信息:

Creates a SQL script file by extracting the schema and data of a database.
Usage: java org.h2.tools.Script <options>
Options are case sensitive. Supported options are:
[-help] or [-?]    Print the list of options
[-url "<url>"]     The database URL (jdbc:...)
[-user <user>]     The user name (default: sa)
[-password <pwd>]  The password
[-script <file>]   The target script file name (default: backup.sql)
[-options ...]     A list of options (only for embedded H2, see SCRIPT)
[-quiet]           Do not print progress information
See also http://h2database.com/javadoc/org/h2/tools/Script.html

2) 我已经从 H2 控制台使用 SCRIPT 命令进行了测试。它也有效。

尽管如此,SCRIPT 命令的结果可能会产生误导。
看官方文档:

如果没有指定 'TO fileName' 子句,脚本将作为 结果集。该命令可用于创建备份 数据库。对于长期存储,它比复制更便携 数据库文件。

如果指定了“TO fileName”子句,则整个脚本 (包括插入语句)被写入这个文件,结果 返回没有插入语句的集合。

您已使用SCRIPT TO 'fileName' 命令。在这种情况下,整个脚本 (包括插入语句)被写入此文件,结果在 H2 控制台中,您拥有除插入语句之外的所有内容。
例如,输入SCRIPT TO 'D:\yourBackup.sql' 命令(或Unix 友好目录,如果你使用它),然后打开文件,你会看到存在SQL 插入。

如文档中所述,如果您想在 H2 控制台的输出结果中同时获取结构和插入语句,请不要指定 TO 参数。 只需输入:SCRIPT

问题2:*.sql 插入文件是插入初始文件的唯一方法吗? 数据集到 h2 db 中进行集成测试?

正如长时间讨论的那样 :) 您可以使用 DBunit 数据集(其中的一种解决方案)。

【讨论】: