sql-gen
Описание
Ещё один ORM для SQL на Scala
Языки
- Scala100%
sql-gen — типобезопасный генератор SQL-запросов для Scala
Библиотека для автоматической генерации SQL-запросов на основе декларативного описания схемы данных. Реализует подход "схема как код" (schema-as-code), обеспечивая типобезопасность и сокращая рутинную работу при взаимодействии с реляционными базами данных.
Основная философия
В отличие от классических ORM, которые стремятся полностью абстрагировать базу данных,
занимает промежуточную позицию:
- Не ORM: не создает "виртуальную объектную базу", не управляет состоянием объектов
- Не сырой SQL: избегает рисков SQL-инъекций и опечаток
- Генератор с проверкой типов: преобразует Scala-структуры в SQL с проверкой на этапе компиляции
Проблематика
При разработке приложений с богатой предметной областью возникает экспоненциальный рост сложности:
Типичные проблемы ручного написания SQL:
- Опечатки в именах таблиц и колонок (
вместо"auhtors")"authors" - Несогласованность типов между Scala и SQL
- Дублирование кода для похожих сущностей
- Сложность рефакторинга при изменении схемы
- Проблемы безопасности при конкатенации строк
решает эти проблемы через:
- Единый источник истины для схемы (Scala-код)
- Автоматическую генерацию валидного SQL
- Проверку типов на этапе компиляции
- Расширяемую систему генераторов
Установка
Для sbt:
Для Maven:
Для Gradle:
Детальное описание компонентов
ColumnDefinition: строительный блок схемы
— центральная структура для описания колонок:
Предопределенные типы колонок:
Констрейнты и значения по умолчанию:
TableSchema: описание таблицы
Класс типов связывает Scala-тип с SQL-таблицей:
Пример схемы:
Генераторы SQL: от схемы к запросам
Каждый генератор — это функция, принимающая схему и производящая :
1. Создание таблиц и типов
Особенности генерации CREATE TABLE:
- Автоматически добавляет
для идемпотентностиIF NOT EXISTS - Сохраняет порядок колонок как в columns
- Генерирует
,PRIMARY KEY,CHECK,DEFAULTNOT NULL
2. CRUD-операции
Вставка с возвратом ID (Insert-Returning):
Особенности:
- Исключает колонку
изid,INSERTгенерируется автоматическиid - Корректно обрабатывает enum-типы через ?::TypeName
- Поддерживает
для получения сгенерированных значенийRETURNING
Выборка данных:
Обновление:
Удаление:
Интеграция с Doobie
Библиотека тесно интегрирована с Doobie — функциональной JDBC-библиотекой для Scala.
Ограничения и альтернативы
Когда использовать sql-gen:
- ✅ Проекты с четко определенной схемой
- ✅ Когда нужна максимальная типобезопасность
- ✅ Для генерации DDL и базовых CRUD-операций
Когда рассмотреть альтернативы:
- ⚠️ Slick — если нужны сложные запросы с JOIN
- ⚠️ Doobie с plain SQL — если схема часто меняется
- ⚠️ ZIO Quill — для интеграции с ZIO
- ⚠️ Чистые SQL миграции - для ручной генерации
Вклад в развитие
Библиотека спроектирована для расширения.
Приветствуются:
- Генераторы для сложных запросов (JOIN, подзапросы)
- Поддержка дополнительных СУБД (MySQL, SQLite)
- Интеграция с инструментами миграции (Flyway, Liquibase)
Заключение
— это библиотека для генерации SQL запросов.
Она не заменяет знания SQL, а делает работу с ним более безопасной и продуктивной.
Используйте её как фундамент для построения надежных data access слоев в Scala-приложениях.
Дополнительные ресурсы: