sql-gen

Шаблон
0

Описание

Ещё один ORM для SQL на Scala

Шаблон

Используйте репозиторий как шаблон для создания нового репозитория

Языки

  • Scala100%
3 месяца назад
3 месяца назад
23 дня назад
3 месяца назад
3 месяца назад
3 месяца назад
3 месяца назад
3 месяца назад
3 месяца назад
23 дня назад
README.md

sql-gen — типобезопасный генератор SQL-запросов для Scala

Библиотека для автоматической генерации SQL-запросов на основе декларативного описания схемы данных. Реализует подход "схема как код" (schema-as-code), обеспечивая типобезопасность и сокращая рутинную работу при взаимодействии с реляционными базами данных.

Основная философия

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

sql-gen
занимает промежуточную позицию:

  • Не ORM: не создает "виртуальную объектную базу", не управляет состоянием объектов
  • Не сырой SQL: избегает рисков SQL-инъекций и опечаток
  • Генератор с проверкой типов: преобразует Scala-структуры в SQL с проверкой на этапе компиляции

Проблематика

При разработке приложений с богатой предметной областью возникает экспоненциальный рост сложности:

Типичные проблемы ручного написания SQL:

  1. Опечатки в именах таблиц и колонок (
    "auhtors"
    вместо
    "authors"
    )
  2. Несогласованность типов между Scala и SQL
  3. Дублирование кода для похожих сущностей
  4. Сложность рефакторинга при изменении схемы
  5. Проблемы безопасности при конкатенации строк

sql-gen
решает эти проблемы через:

  • Единый источник истины для схемы (Scala-код)
  • Автоматическую генерацию валидного SQL
  • Проверку типов на этапе компиляции
  • Расширяемую систему генераторов

Установка

Maven Central

Maven Central

Для sbt:

Для Maven:

Для Gradle:

Детальное описание компонентов

ColumnDefinition: строительный блок схемы

ColumnDefinition
— центральная структура для описания колонок:

Предопределенные типы колонок:

Констрейнты и значения по умолчанию:

TableSchema: описание таблицы

Класс типов

TableSchema[T]
связывает Scala-тип с SQL-таблицей:

Пример схемы:

Генераторы SQL: от схемы к запросам

Каждый генератор — это функция, принимающая схему и производящая

doobie.Fragment
:

1. Создание таблиц и типов

Особенности генерации CREATE TABLE:

  • Автоматически добавляет
    IF NOT EXISTS
    для идемпотентности
  • Сохраняет порядок колонок как в
    columns
  • Генерирует
    PRIMARY KEY
    ,
    CHECK
    ,
    DEFAULT
    ,
    NOT 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-gen
— это библиотека для генерации SQL запросов. Она не заменяет знания SQL, а делает работу с ним более безопасной и продуктивной. Используйте её как фундамент для построения надежных data access слоев в Scala-приложениях.


Дополнительные ресурсы: