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 не может автоматически откатить вставку данных).