小编典典

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

sql

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

我已经成功使用了此处FILE_READ描述的功能。

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

该功能在完整路径下效果很好,但是我无法在相对路径下做到这一点。当在除我的以外的任何其他机器上下载和编译源代码(以及进行测试)时,这不能很好地工作。

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

我已经搜索并找到了这个方法:通过sql脚本插入BLOB? 但是RAWTOHEX函数似乎适用于字符串,而我的输入是一个二进制文件。

有任何想法吗?


阅读 228

收藏
2021-05-30

共1个答案

小编典典

FILE_READ文档中:

支持文件名和URL。要从类路径中读取流,请使用前缀类路径:

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

通过代码使用RunScript

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

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

然后以logo.png这种方式将s作为项目资源添加,您可以在脚本中使用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')

希望能帮助到你,

2021-05-30