将BLOB从文件插入到sql脚本中以嵌入H2数据库

时间:2016-07-13 13:43:55

标签: sql database integration-testing h2

我正在创建一个SQL脚本来创建一个新模式,并将一些值插入到嵌入式H2数据库中,以便与Spring Boot应用程序中的集成测试一起使用。我需要插入的值之一是sql表上的BLOB字段。

我已成功使用FILE_READ函数,如here所述。

INSERT INTO MY_TABLE(ID, NAME, LOGO) 
VALUES('1', 'test1', FILE_READ('C:/myproject/logo.png'));

该功能适用​​于完整路径,但我无法用相对路径做到这一点。当在我们之外的任何其他机器上下载和编译(以及测试)源时,这不能很好地工作。

我需要从二进制文件中插入一个BLOB字段到一个sql脚本,该文件是从拥有该脚本的项目的相对路径加载的。

我搜索过并发现了这个问题:insert a BLOB via a sql script?RAWTOHEX函数似乎适用于字符串,我的输入是二进制文件。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

来自FILE_READ文档:

  

支持文件名和URL。从中读取流   classpath,使用前缀classpath:

似乎使用相对路径是不可能的;然后,一个可能的解决方案是在classpath中包含具有所需二进制内容的文件,并使用classpath:中的FILE_READ访问它。这样,您可以将其部署在任何其他计算机上,而无需担心绝对路径。

使用RunScript

的代码

因此,如果在执行测试之前,您可以使用以下代码设置运行脚本的数据库:

RunScript.execute(conn, new FileReader("yourScript.sql"));

然后将logo.png添加为项目资源,这样您就可以使用classpath:表示法在脚本中引用它:FILE_READ('classpath:/your/package/resource/logo.png')

使用命令行工具中的RunScript

如果您使用命令行工具,则可以创建 .jar 来打包资源,例如resource.jar并将其添加到cmd中的classpath

java -cp h2*.jar;resource.jar org.h2.tools.RunScript -url jdbc:h2:~/test -script yourScript.sql

然后,如您脚本中的上一个案例,您可以使用FILE_READ('classpath:/your/package/resource/logo.png')

来引用您的二进制文件

希望它有所帮助,