ТРИ СПОСОБА РАБОТЫ С SQL БД В GOВ Go существует множество инструментов для работы с SQL базами данных. На данный момент я выделяю три основных подхода: автогенерация, ORM, и Query Builder-ы. Каждый из них предлагает свои преимущества и ограничения. Давайте я поделюсь своим мнением о каждом из них, чтобы понять, когда какой стоит выбирать.
1️⃣
Автогенерация Автогенерация - генерация Go-кода на основе SQL-запросов. Данный подход чем-то напоминает работу со спецификациями API. Самый популярный инструмент на данный момент, который используется многими:
sqlc. Он позволяет писать SQL-запросы, которые затем транслируются в чистый Go-код. Этот подход отлично подходит для случаев, когда требуется строгий контроль над SQL и высокая производительность.
Плюсы:1. Статическая типизация: генерация строго типизированного Go-кода снижает вероятность ошибок и экономит время.
2. Высокая производительность: работает с «чистым» SQL, без лишних оберток.
3. Простота: нет необходимости изучать ORM или API библиотеки для написания запросов.
4. Поддерживает MySQL, PostgreSQL, SQLite.
Минусы:1. Отсутствие гибкости: не подходит для сложных запросов с динамической логикой.
Когда использовать: если проект требует строгого контроля над SQL, и важна производительность.
2️⃣
ORMОх, сколько вопросов мне задавали про ORM-ки в Go... Большинство разработчиков пришедших в Go из других языков любят ORM и ждут, что в Go они тоже есть. Да они есть (к сожалению или к счастью). Но мне, как человеку, работавшему с ERP системами, где приходиломь писать огромные SQL запросы, на разработку которых могло уйти несколько дней, чтобы сделать его оптимальным, правильным да еще подобрать нужные индексы, ORM кажутся чем-то несерьезным (хотя возможно это не так). В общем новичкам я бы советовал вначале избекать ORM любой ценой.
Однака в Go, как я уже упомянул выше, есть ORM, и самая известная —
GORM. GORM —
фантастическая (как ее называют) ORM, предлагающая множество инструментов для работы с БД в стиле Active Record. Подходит для проектов, где требуется сложная логика запросов и удобная работа с моделями.
Плюсы:1. Абстракция: значительно упрощает взаимодействие с базой данных (считайте что SQL, индексы вам знать не обязательно🙂).
2. Большая поддержка разного функционала (все-таки Gorm довольно давно развивается активно, так что там можно найти все что нужно)
Минусы:1. Производительность: за абстракцию приходится платить сниженной производительностью.
2. Нужно погрузится в API библиотеки.
Когда использовать: отлично подходит для CRUD-приложений, где важнее скорость разработки, чем производительность.
3️⃣
Query Builder-ы Query Builder-ы — незаменимая класика: гибкость, баланс и универсальность. Query Builder-ы (например,
squirrel) позволяют писать SQL-запросы в Go-коде, сохраняя гибкость, но без излишней абстракции ORM. Это средний вариант между sqlc и GORM.
Плюсы:1. Гибкость: удобно для динамических SQL-запросов.
2. Читаемость: позволяет строить сложные запросы пошагово.
3. Производительность: близка к ручному SQL, но проще в использовании.
4. Универсальность: легко встроится в любой проект, а API Query Builder-ов интуитивно понятны.
5. Низкий порог входа (если знаете SQL).
Минусы:1. Типизация: не так безопасен, как sqlc, т.к. не генерирует типизированный код.
2. Требует понимания SQL и логики работы базы и индексов (ну а как без этого?)).
3. Не все Query Builder-ы cпособны осилить сложные запросы.
4. Для простых CRUD может стать утомительно писать одно и тоже (решается путем генерации шаблонного кода)
Когда использовать: оптимально для приложений со сложными, динамическими запросами.
Ставь 👍, если хочешь углубиться в эту тему поподробнее.