Gymterview
middle

Как работать с данными в Liquibase (insert, loadData, loadUpdateData)?

Liquibase поддерживает три основных способа работы с данными: поштучная вставка через insert, массовая загрузка из CSV через loadData и upsert-загрузка через loadUpdateData.

insert

Вставка одной или нескольких записей:

Пример insert с rollback
<changeSet id="10" author="ivanov">
    <insert tableName="currencies">
        <column name="code" value="RUB"/>
        <column name="name" value="Российский рубль"/>
        <column name="is_active" valueBoolean="true"/>
    </insert>
    <insert tableName="currencies">
        <column name="code" value="USD"/>
        <column name="name" value="Доллар США"/>
        <column name="is_active" valueBoolean="true"/>
    </insert>

    <rollback>
        <delete tableName="currencies">
            <where>code IN ('RUB', 'USD')</where>
        </delete>
    </rollback>
</changeSet>

loadData

Загрузка данных из CSV-файла:

Пример
<changeSet id="11" author="ivanov">
    <loadData tableName="currencies"
              file="db/data/currencies.csv"
              separator=","
              encoding="UTF-8">
        <column name="code" type="STRING"/>
        <column name="name" type="STRING"/>
        <column name="is_active" type="BOOLEAN"/>
    </loadData>
</changeSet>

Файл currencies.csv:

Пример
code,name,is_active
RUB,Российский рубль,true
USD,Доллар США,true
EUR,Евро,true

loadUpdateData

Комбинация INSERT и UPDATE — если запись существует (по первичному ключу или указанному столбцу), она обновляется; если не существует — вставляется:

Пример
<changeSet id="12" author="ivanov">
    <loadUpdateData tableName="currencies"
                    file="db/data/currencies.csv"
                    primaryKey="code"
                    separator=","
                    encoding="UTF-8">
        <column name="code" type="STRING"/>
        <column name="name" type="STRING"/>
        <column name="is_active" type="BOOLEAN"/>
    </loadUpdateData>
</changeSet>

Это особенно полезно для справочных данных, которые могут обновляться от релиза к релизу.

На собеседовании: важно знать разницу между loadData и loadUpdateData. Частая ошибка — забывать, что для insert нужно вручную писать rollback (Liquibase не может автоматически откатить вставку данных).