sqlc в Go: нужен ли ручной слой репозиториев? Разбор по SOLID, DDD и Go‑прагматизму
physicist2018 14 минут назад sqlc в Go: нужен ли ручной слой репозиториев? Разбор по SOLID, DDD и Go‑прагматизму Средний 6 мин 378 Go * SQL * Мнение Давайте честно — и да, и нет.Этот вопрос возникает у каждого...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Вот важная новость с фронта ИИ: physicist2018 14 минут назад sqlc в Go: нужен ли ручной слой репозиториев? Разбор по SOLID, DDD и Go‑прагматизму Средний 6 мин 378 Go * SQL * Мнение Давайте честно — и да, и нет. Этот вопрос возникает у каждого Go‑разработчика, который начинает использовать sqlc.
Генератор кода создаёт отличные типизированные запросы, но как правильно интегрировать их в архитектуру приложения? Стоит ли оборачивать сгенерированный Querier в ручной слой репозиториев, чтобы соблюсти «букву» чистой архитектуры, или использовать его напрямую в сервисах (use cases), следуя принципу KISS? Мы разберём эту дилемму через призму пяти ключевых перспектив: SOLID (все 5 принципов), идиомы Go, DDD, тестирование и скорость разработки.
Технические детали
Смотрим через призму SOLIDS — Single Responsibility (Принцип единственной ответственности)Суть: у модуля должна быть только одна причина для изменения. Use case отвечает за бизнес‑логику и за преобразование pgtype в доменные типы. Это две причины для изменения: может поменяться бизнес‑правило либо способ маппинга типов (например, из‑за обновления драйвера).
Формально это нарушение SRP, но на практике оно часто допустимо. Он берёт на себя всю конвертацию, оставляя use case исключительно с бизнес‑логикой. В этом варианте SRP соблюдается строже.
Вывод: с точки зрения SRP ручной слой выглядит предпочтительнее, но в Go нередко жертвуют формальным соблюдением принципа ради простоты. O — Open‑Closed (Принцип открытости‑закрытости)Суть: программные сущности должны быть открыты для расширения, но закрыты для модификации. Интерфейс генерируется sqlc и содержит все методы.
Отраслевые последствия
При добавлении нового запроса вы не меняете существующий интерфейс (он перегенерируется), но расширяете набор вызовов в use case. Однако сам интерфейс жёстко привязан к набору запросов в БД: подменить его на другую реализацию без перегенерации сложно. Вы сами определяете только те методы, которые реально нужны домену.
Интерфейс можно расширять новыми методами, не меняя существующие. Реализация репозитория может быть дополнена (например, кешированием) без изменения контракта. Вывод: ручной слой даёт больше гибкости, потому что вы контролируете контракт, а не подстраиваетесь под автоматически сгенерированный набор методов.
L — Liskov Substitution (Принцип подстановки Барбары Лисков)Суть: объекты в программе должны быть заменяемы экземплярами их подтипов без потери корректности работы программы. Любую его реализацию (сгенерированную sqlc или мок для тестов) можно подставить в use case — при условии, что сигнатуры совпадают. Аналогично: реализация репозитория легко заменяется на мок или другую имплементацию.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





