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