Объединение значений из БД с использованием Liquibase и Spring

Я пытаюсь использовать liquibase для изменения макета моей БД, но у меня есть вопрос:

Допустим, например, что в моей старой БД есть таблица с двумя столбцами (firstName, lastName), но в моей новой БД есть только один столбец для этих двух (userName).

Как я могу выполнить эту миграцию, используя 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>

person Gonçalo Cardoso    schedule 27.08.2012    source источник


Ответы (1)


Вам нужен индивидуальный рефакторинг. Есть две возможности:

Так что вы бы

  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);
}
person Christoph Leiter    schedule 27.08.2012
comment
Я пытаюсь использовать класс Custom Refactoring, но не могу сделать рабочий пример. Я могу получить доступ к методу public void execute(Database arg0) моего класса, но я не могу вставить какое-либо значение в БД. Не могли бы вы предоставить ссылку на пример использования класса Custom Refactoring? Поскольку ссылка на странице LiquiBase не работает - person Gonçalo Cardoso; 27.08.2012
comment
Я добавил пример кода в свой ответ. Он использует Spring JdbcTemplate, потому что вы спросили, как это сделать с помощью Spring. Но вы, конечно, можете просто использовать Connection для работы с простым JDBC. - person Christoph Leiter; 27.08.2012
comment
Спасибо за обновление, я пытаюсь реализовать пример, используя QueryDSL с JdbcTemplate или простой JDBC, потому что я пытаюсь сделать все свое приложение бесплатным SQL. - person Gonçalo Cardoso; 27.08.2012
comment
Обычно это хорошо, но вам действительно следует использовать SQL для переноса данных. Вы не можете полагаться на какие-либо объекты (через JPA или QueryDSL), потому что они могут (и, вероятно, будут) меняться в будущем, и поэтому ваши сценарии миграции (которые полагаются на старую структуру, но структура изменилась!) ломаются. - person Christoph Leiter; 27.08.2012