使用Liquibase和Spring从DB值合并(Merging values from DB us

2019-09-21 18:28发布

我试图用liquibase改变我的DB的布局,但我有一个问题,那就是:

让我们说,例如,我的老数据库有一个表,有2列(名字,姓氏),但我的新的数据库只有一个那两个(用户名)列。

我怎么能做使用liquibase和Spring这个迁移。 因为具有以下逻辑我会失去原有的价值。

理想情况下,我想能够调用我的java代码进行更改,但事件在这种情况下,它已经结束了在可能需要其他情况下工程;)

<databaseChangeLog
    xmlns="http://www.liquibase.org/xml/ns/dbchangelog/1.1"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog/1.1
    http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-1.1.xsd">

    <changeSet author="gcardoso" id="2012082703">

        <dropColumn columnName="firstName" tableName="t_user"/>
        <dropColumn columnName="lastName" tableName="t_user"/>

        ?????? How to migrate the names ??????

        <addColumn tableName="t_user">
            <column name="userName" type="VARCHAR2(255,0)">
                <constraints nullable="false"/>
            </column>
        </addColumn>
    </changeSet>
</databaseChangeLog>

Answer 1:

你需要一个定制的重构。 有两种可能性:

  • 自定义SQL的变化,可以用SQL实现
  • 自重构类的更复杂的变化。 通过这种方法,你可以使用Java来实现你的重构。

所以,你会

  1. 添加新列
  2. 从旧的列中的数据迁移到新列使用自定义重构变化
  3. 删除旧的列

如何使用Spring的JdbcTemplate自定义类重构

@Override
public void execute(Database database) throws CustomChangeException {
    JdbcConnection connection = (JdbcConnection) database.getConnection();
    DataSource dataSource = new SingleConnectionDataSource(connection.getUnderlyingConnection(), true);
    JdbcTemplate template = new JdbcTemplate(dataSource, false);
}


文章来源: Merging values from DB using Liquibase and Spring