mariadb 我正尝试在Maria数据库上创建一个运行flyway迁移的表,并希望在表中保存图像blob?

6ljaweal  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(159)

有什么想法我可以保存它而不写一个大的sql文件。图像小于MEDIUMBLOB的大小。但写sql创建和插入数据到表是非常笨拙和不可维护的。
当前实施:我在mariadb上使用带有flyway迁移的Spring Boot

resources
   db.migration
      - V2__init.sql
      - V3__insert_table_data.sql

在V2__init.sql内部

CREATE TABLE IF NOT EXISTS table_name
(
    id PRIMARY KEY,
    image MEDIUMBLOB
);

在V3__insert_table_data.sql内部

INSERT INTO table_name VALUES (‘some_id’,’<very_big_image_data>’)

如何将图像文件直接读入sql,并将条目插入表中。任何帮助和想法都不胜感激:)

cgh8pdjw

cgh8pdjw1#

这个问题与我们的团队最初尝试使用基于sql的flyway迁移时遇到的问题类似
由于使用SQL语句存储blob的复杂性,我们转而在基于Java的迁移脚本中使用spring JDBC模板。https://flywaydb.org/documentation/concepts/migrations#java-based-migrations
关于您的问题,我们需要在src/main/java文件夹中创建一个名为db.migration的单独文件夹,以便flyway选择基于java的迁移,并根据名称中提供的版本号依次运行它。

src
   main
      java
        com.example.package
        db.migration
          - V3__insert_table_data.java
      resources
        db.migration
          - V2__init.sql

使用spring jdbc模板和从机器读取图像文件的示例实现。这假定图像与源代码一起签入

public class V3__insert_table_data extends BaseJavaMigration {
    public void migrate(Context context) {
      var image = getImageFromFile("filename.svg");
      var insertStatement = "INSERT INTO table_name VALUES ('id1', '" + image + "')";

      new JdbcTemplate(new SingleConnectionDataSource(context.getConnection(), true))
                .execute(insertStatement);
    }
}

//helper method to retrieve images from file system
private String getImageFromFile(String fileName) throws IOException {
   try(FileInputStream image = new FileInputStream("pathToImage/" + fileName)){
    var bytes = logo.readAllBytes();

    // You might want to Base64 encode the image to prevent any sql grammar insertion error happening
    var encodedBytes = Base64.getEncoder().encode(bytes);
    return new String(encodedBytes);
  }
}

相关问题