Как обновить старую схему базы данных до новой в Java с liquibase - PullRequest
1 голос
/ 16 апреля 2020

Я и моя команда работали над проектом отдельно от другой команды. Эта команда работала над этим проектом 2 года, и теперь они уходят, оставив нам весь проект, и за последние 2 месяца нам пришлось узнать о проекте и добавить некоторые функции (например, мультивалютность, новый процесс адаптации и т. Д. c). ) и эта функция подразумевает новые столбцы в базе данных, новые таблицы и так далее. И нам нужно обновить старую производственную базу данных до новой, ничего не нарушая (мы не можем просто удалить ее и запустить fre sh с новыми сценариями). Мы хотим создать какой-нибудь обобщенный c скрипт в Java Spring для этой и других миграций в будущем, что-то вроде «возьмите эту таблицу и добавьте этот столбец, если он не существует, но если он существует и он пуст /» null, добавьте в него эти данные (например, phone_number, который должен иметь каждый пользователь, и, если он отсутствует, добавьте автоинкремент: 000000001, 00000002 и т. д. c., и после этого мы должны попросить пользователей подтвердить свой телефон и переопределить это 0000001, 0000002) ". Таким образом, мы можем сделать так, чтобы старая схема выглядела точно так же, как новая, и мы хотим создать интерфейс или что-то, что сделало бы более общие c эти миграции. Как вы думаете, как лучше решить эту проблему?

Спасибо!

1 Ответ

1 голос
/ 16 апреля 2020

Поскольку вы знаете, что меняет потребности вашей "старой схемы", и готовы их реализовать - Liquibase выглядит как удобное решение.

Вы должны написать необходимые changeSets в обновите вашу схему.

Liquibase предлагает много изменений , достаточных для сценариев основы c миграции.

Чтобы добавить новую таблицу, вы можете использовать createTable change :

<changeSet id="foo" author="bar">
    <preConditions onFail="MARK_RAN">
        <not>
            <tableExists tableName="your_table"/>
        </not>
    </preConditions>
    <createTable tableName="your_table">
        <!-- your columns here -->
    </createTable>
</changeSet>

Для добавления столбца вы можете использовать addColumn change :

<changeSet id="foo2" author="bar">
    <preConditions onFail="MARK_RAN">
        <not>
            <columnExists tableName="your_table" columnName="your_column"/>
        </not>
    </preConditions>
    <addColumn tableName="your_table">
        <column name="your_column" type="integer">
            <constraints nullable="false"/>
        </column>
    </addColumn>
</changeSet>

Для обновления данных вы можете использовать update изменить :

<changeSet id="foo3" author="bar">
    <preConditions onFail="MARK_RAN">
        <columnExists tableName="your_table" columnName="your_column"/>
    </preConditions>
    <update tableName="your_table">
        <column name="your_column" value="123"/>
        <where>your_column IS NULL</where>
    </update>
</changeSet>

Для базовых c SQL запросов вы можете использовать sql изменить :

<changeSet id="foo4" author="bar">
    <preConditions onFail="MARK_RAN">
        <sqlCheck expectedResult="1">
            <!-- something like -->
            SELECT * from your_table where your_column = 100;
        </sqlCheck>
    </preConditions>
    <sql>DELETE FROM your_table WHERE your_column=100</sql>
</changeSet>

И так далее, и так далее. Вы объединяете все наборы изменений в databaseChangeLog , добавляете changeLogs в свое приложение, и вы готовы к go с обновлением "старой схемы"!

...