exo*_*dus 5 sql database integration-testing h2
我正在创建一个 SQL 脚本来创建新架构并将一些值插入到嵌入 H2 数据库中,以便与 Spring Boot 应用程序中的集成测试一起使用。我需要插入的值之一是 sql 表上的 BLOB 字段。
我已成功使用此处FILE_READ描述的功能。
INSERT INTO MY_TABLE(ID, NAME, LOGO)
VALUES('1', 'test1', FILE_READ('C:/myproject/logo.png'));
Run Code Online (Sandbox Code Playgroud)
该函数适用于完整路径,但我无法使用相对路径来做到这一点。当在我的机器以外的任何其他机器上下载并编译(加上测试)源代码时,这种方法效果不佳。
我需要将二进制文件中的 BLOB 字段插入到 SQL 脚本中,该二进制文件是从拥有该脚本的项目的相对路径加载的。
我搜索并找到了这种方法:insert a BLOB via a sql script?
但RAWTOHEX函数似乎可以与字符串一起使用,并且我的输入是一个二进制文件。
有任何想法吗?
来自FILE_READ文档:
支持文件名和 URL。要从类路径读取流,请使用前缀类路径:
看来使用相对路径是不可能的;那么一个可能的解决方案是将具有所需二进制内容的文件包含在 中并使用inclasspath访问它。这样您就可以将其部署在任何其他计算机上,而不必担心绝对路径。classpath:FILE_READ
通过代码使用RunScript
因此,如果在执行测试之前,您使用以下代码通过代码设置运行脚本的数据库:
RunScript.execute(conn, new FileReader("yourScript.sql"));
Run Code Online (Sandbox Code Playgroud)
然后将其添加logo.png为项目的资源,这样您就可以使用classpath:符号在脚本中引用它:FILE_READ('classpath:/your/package/resource/logo.png')。
RunScript从命令行工具使用
如果您使用命令行工具,您可以创建一个.jar来打包您的资源,例如resource.jar并将其添加到classpath您的 cmd 中:
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')
希望能帮助到你,