Liquibase + SpringBoot, создание скриптов
Liquibase: Гайд по безболезненным миграциям баз данных
На сегодняшний день поддержка целостности баз данных и управление миграциями схем и данных — важная часть процесса разработки. Одним из популярных и гибких инструментов для управления изменениями БД является Liquibase. Liquibase — это open-source решение, которое позволяет: Liquibase работает с changelog-файлами, которые описывают изменения в декларативном виде. Вот некоторые рекомендации по формированию changelog-файлов: Хотя Liquibase и поддерживает формат SQL, предпочтительнее использовать декларативные форматы — JSON/XML/YAML...
Вредные советы: Liquibase и черная магия validCheckSum
Вредные советы: Liquibase и черная магия validCheckSum Иногда нужно поправить SQL в старом changelog — но Liquibase ругается: checksum validation failed. Решение — параметр validCheckSum. Он позволяет вручную указать, какие контрольные суммы считать валидными: <changeSet id="101" author="dev"> <validCheckSum>7:3b1d2f5a7d4a8c5f3c8f6a2e7a6f8b1</validCheckSum> <validCheckSum>8:9d4f3a2b6e7c1d9e2a3b8c7f4a6d5b3</validCheckSum> <sql>UPDATE users SET active = true WHERE last_login IS NOT NULL;</sql> </changeSet> Liquibase сверит текущий checksum с любым из допустимых. Советую ли я это применять - нет, не советую, но на крайний случай знать о такой возможности стоит...
🧪 Зачем Java-разработчику тестировать логику в SQL
🧪 Зачем Java-разработчику тестировать логику в SQL? Привет! Сегодня покажу вам полезный трюк для тех, кто пишет сложные запросы в PostgreSQL (или любом другом SQL-движке) и хочет их тестировать ещё до интеграции в Java-приложение. Если у тебя в проекте сложная логика в JOIN, CASE, оконных функциях или CTE — протестируй это на стороне базы, как обычную функцию. 🔹 Создаём функцию в PostgreSQL: CREATE OR REPLACE FUNCTION test_discount(user_id INT) RETURNS NUMERIC AS $$ BEGIN RETURN ( SELECT CASE WHEN u.vip = true THEN 0.2 ELSE 0.05 END FROM users u WHERE u.id = user_id ); END; $$ LANGUAGE plpgsql; 🔹 Проверяем прямо в базе: SELECT test_discount(101); -- вернёт 0...