Go: SQL
Теория: Заключение
К этому моменту выстроена вся цепочка работы с базой: от первого подключения через database/sql до генерации кода sqlc и поддержки схемы миграциями. Теперь видно, как слои накладываются друг на друга и почему они так устроены. Соединение открывается один раз и управляется пулом, запросы получают контекст и возвращают предсказуемые ошибки, транзакции изолируют операции и дают атомарность, а миграции фиксируют состояние схемы и делают изменения повторяемыми.
Главная мысль проста: database/sql не скрывает SQL, а помогает работать с ним аккуратно и надёжно. Это тонкий слой, который управляет соединениями, таймаутами, ошибками и отдаёт контроль разработчику. На нём можно строить что угодно — от простых сервисов до сложных систем с большим количеством таблиц и логикой.
sqlc решает задачу типобезопасности. Ручной Scan() исчезает, структуры и методы получаются из SQL напрямую, а несовместимости находят себя на этапе компиляции. Код слоя данных становится проще, предсказуемее и легче тестируется. goose закрывает последний участок пути — хранит историю схемы, обеспечивает единый порядок её изменения и даёт возможность безопасно откатывать шаги. В связке sqlc и goose схема и код двигаются синхронно, а приложение всегда работает с тем, что реально лежит в базе.
На этой основе уже понятны ключевые механизмы: что происходит при установлении соединения, как работают подготовленные выражения, почему важно закрывать rows, что делает транзакция внутри одного соединения, как рождаются структуры sqlc и какое место занимают миграции в жизненном цикле базы. Это фундамент, на котором строится любой слой доступа к данным.


