【问题标题】:How to manipulate the production database data format using Spring?如何使用 Spring 操作生产数据库数据格式?
【发布时间】:2018-08-11 18:39:09
【问题描述】:

情况如下:

  • Spring 生产应用程序使用带有 varchar 列的表 (MySQL),
  • 我需要将列更改为二进制 blob,
  • 并加密现有数据(使用 Java,而不是数据库)。

这个过程的两个已知步骤是:

  • 我需要更新实体,更改注释(从 varchar 到 blob)
  • 我需要运行迁移以更改列格式(使用 SQL 和 Flyway)
  • 这一切都将在我停止应用程序、替换应用程序 jar(更改为新版本)并再次运行时完成。

问题:

  • 当它仍然是 varchar 时,我需要从列中取出旧数据,使用 Java 对其进行加密,并在迁移后将其再次存储在 blob 列中。 (修改后输入的新数据没有问题,会自动加密,问题出在旧数据上。)
  • 我应该使用什么方法来处理这个更新?哪些一般步骤是正确的?

这是一个更普遍的 Spring 问题 - 当您需要更改生产中现有的结构并操作旧数据以适应新格式时,您如何处理这种情况?

例如在 PHP 中,我使用与应用程序集成的终端脚本并在应用程序环境中运行(在 Laravel 中使用“artisan”命令);我可以轻松地创建正确的操作顺序:获取旧数据并记住它,更改数据库结构,操作旧数据,并将数据插入新结构 - 这一切都在一个脚本和一个事务中。我不知道如何在 Spring 中执行此操作。

【问题讨论】:

    标签: java spring hibernate spring-data flyway


    【解决方案1】:

    我找到了答案 - 基于 Java 的 Flyway 迁移:https://flywaydb.org/documentation/migrations#java-based-migrations

    基于 Java 的迁移非常适合所有无法使用 SQL 轻松表达的更改。这些通常是 BLOB 和 CLOB 更改、高级批量数据更改(重新计算、高级格式更改……)

    看起来像这样:

    package db.migration;
    
    import org.flywaydb.core.api.migration.spring.SpringJdbcMigration;
    import org.springframework.jdbc.core.JdbcTemplate;
    
    /**
     * Example of a Spring Jdbc migration.
     */
    public class V1_2__Another_user implements SpringJdbcMigration {
        public void migrate(JdbcTemplate jdbcTemplate) throws Exception {
            jdbcTemplate.execute("INSERT INTO test_user (name) VALUES ('Obelix')");
        }
    }
    

    这里可以将数据库操作与 Java 代码和数据操作交错。

    我怀疑 Liquibase 也有类似的功能。

    【讨论】:

      猜你喜欢
      • 2015-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-23
      • 2016-12-08
      • 1970-01-01
      • 1970-01-01
      • 2019-09-03
      相关资源
      最近更新 更多