【问题标题】:Insert BLOB from a file into a sql script to embed H2 database将文件中的 BLOB 插入 sql 脚本以嵌入 H2 数据库
【发布时间】:2016-11-16 03:33:12
【问题描述】:

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

有什么想法吗?

【问题讨论】:

    标签: sql database integration-testing h2


    【解决方案1】:

    来自FILE_READ 文档:

    支持文件名和 URL。从 类路径,使用前缀类路径:

    似乎使用相对路径是不可能的;那么一个可能的解决方案是将具有所需二进制内容的文件包含在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并在你的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') 引用您的二进制文件

    希望对你有帮助,

    【讨论】:

    • 有效!我缺少“类路径:”前缀!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-05-16
    • 2014-09-05
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 2012-10-22
    • 2022-12-20
    • 1970-01-01
    相关资源
    最近更新 更多