Для работы любого сервиса обычно нужна база данных. Чаще всего PostgreSQL.
Также требуются общие функции по работе с БД, так называемые CRUD операции,
операции CREATE + READ + UPDATE + DELETE, а также другие функции по работе с БД.

Без создания общих функций получится полный хаос в работе, каждый программист будет делать по‑своему, получится много ошибок и др. Для создания функций CRUD требуется написать много однотипного кода, достаточно трудоёмкая работа, и при этом очень важная, как в доме самое важное — это фундамент, так и в любом сервисе самое важное — это CRUD‑операции.

Есть специализированные ORM для облегчения работы программиста, такие как gorm, тем не менее, всё равно, надо писать функции CRUD самому. (используется компонента pgx pool, т.к. без gorm работает в два раза быстрее) Также нужен код для подключения к БД, отключения, graceful shutdown, балансировщик нагрузки, загрузка параметров из переменных окружения и др.

Для автоматического написания такого кода, я сделал готовый кодогенератор: crud_generator, который напишет полностью готовый микросервис, с CRUD операциями для всех таблиц, которые можно использовать напрямую или по сети через протокол GRPC. Список всех таблиц и колонок берётся напрямую из БД. Заполнить надо только параметры подключения к БД в файле с настройками, можно заполнить фильтр какие таблицы брать, какие исключать, есть ещё много настроек, но все можно не изменять. Получится готовый микросервис, который можно сразу запустить, или можно использовать как библиотеку через import.

Для каждой таблицы в базе данных Postgres SQL автоматически будут сделаны функции для выполнения crud операций:

  • Create()

  • Read()

  • Update()

  • Delete() (или Delete() + Restore() если есть поле is_deleted)

  • Save() - создание новой записи при пустом ID, или обновление записи при не пустом ID

  • ReadFromCache() - чтение из кэша или базы данных

  • Update_ColumnName() - изменение только одной колонки с именем ColumnName, отдельная функция для каждой колонки каждой таблицы.

  • UpdateManyFields() - изменение нескольких колонок, перечисленных в массиве

    Также можно автоматически создать функции:

  • FindBy_ColumnName() - поиск записи по одной или нескольким колонкам

  • FindMassBy_ColumnName() - поиск несколько записей по одной или нескольким колонкам

  • ReadAll() - возврат всех записей таблицы, кроме помеченных на удаление is_deleted=true

Схема как это работает:

Кодогенератор универсальный, будет работать в любой базе, сейчас работает у нас на prod, сгенерировано 700 тысяч строк кода автоматически. Надеюсь ещё кому-нибудь пригодится :-)

Github

Комментарии (8)


  1. des1roer
    25.08.2025 16:11

    Если id не serial а uuid будет работать?


    1. manyakRus Автор
      25.08.2025 16:11

      У нас есть поля типа uuid, работает с ними хорошо, будет тип golang uuid.UUID. ID типа uuid не пробовал.


  1. savostin
    25.08.2025 16:11

    Postgrest?


    1. nik_the_spirit
      25.08.2025 16:11

      in peace


  1. anaxita
    25.08.2025 16:11

    А как понять что это «у вас в проде» работает?

    Выглядит так что вы либо джун либо с другого языка перешли, но судя по переменным «otvet := …” и прочему неймингу - скорее сразу оба варианта и вам по какой то причине в маленькой конторе дали карт-бланш на технические решения, а значит лида нет либо он на другом языке и забил на проект.

    напишите название компании плз чтобы сразу понимать)


    1. manyakRus Автор
      25.08.2025 16:11

      1. Шаблоны кода можно изменять, можете сделать любой нейминг

      2. Тимлид есть, проекты развиваются

      3. Компания Росатом

      4. Репозиторию уже 3 года, и реальным рабочим проектам тоже столько же.

      5. Перешёл с языка 1С на golang 4 года назад

      6. Слово "Otvet" любой поймёт что означает, и для чего нужно.
        У англицизмов неочевидное назначение, слово "Result" может означать что угодно, а слово "Ответ" означает всегда одинаково - что вернётся в результате работы функции


  1. Vitimbo
    25.08.2025 16:11

    Приятно видеть, что на любом языке все эти автокруды оказываются калом :)


  1. Debrainer
    25.08.2025 16:11

    На картинке crud service выглядит как корзина, в которую сложили все яйца.

    Надёжнее было бы каждому сервису с выделенной бизнес-логикой генерить свой crud service.