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

Insert BLOB from a file into a sql script to embed H2 database

我正在创建一个 SQL 脚本来创建一个新模式并将一些值插入到嵌入的 H2 数据库中,以便在 Spring 启动应用程序中用于集成测试。我需要插入的值之一是 sql table.

上的 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 函数似乎适用于字符串,而我的输入是一个二进制文件。

有什么想法吗?

来自 FILE_READ 文档:

File names and URLs are supported. To read a stream from the classpath, use the prefix classpath:

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

通过代码使用 RunScript

因此,如果在执行测试之前,您通过代码设置了数据库 运行 脚本,例如:

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

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

使用命令行工具RunScript

如果你使用命令行工具,你可以创建一个.jar来打包你的资源,例如resource.jar并添加到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')

引用你的二进制文件

希望对您有所帮助,