создание пакета верхнего уровня в gorm orm для микроуслуг в golang - PullRequest
0 голосов
/ 13 апреля 2020

Мы начинающая технологическая компания. мы используем Golang as в качестве основного языка для наших микроуслуг и gorm orm в качестве интерфейса для подключения к нашей базе данных PostgreSQL.

В настоящее время у нас есть несколько микроуслуг, над которыми работают несколько разработчиков. Проблема, однако, состоит в том, что, поскольку в gorm есть много способов сделать что-то одно, каждый по-своему писал запросы к базе данных. Поэтому некоторые люди использовали функцию .Table() для выполнения запросов, а другие просто передавали .Model(), чтобы выяснить саму таблицу.

Так что теперь код не является стандартным, и мы хотим иметь стандартный способ делать запросы в наших базах данных. Мы подумали, что если бы у нас мог быть пакет, подобный библиотеке, который предоставляет нам orm интерфейсы для использования (так что, если мы хотим изменить orm или не использовать какой-либо из них, нам не нужно было менять все коды) стандартным образом, это решает проблему.

Но мы никогда не создавали такую ​​вещь, у нас практически нет идеи, как подойти к проблеме, и если существует какая-либо библиотека, которая сделала бы такое вещь или нет? также мы изо всех сил пытаемся найти стандартный способ выполнения запросов в Golang, поэтому, если бы вы могли поделиться своими идеями о том, как разработать такую ​​систему, которая может даже быть объявлена ​​опубликованной c, мы были бы благодарны.

Ответы [ 2 ]

2 голосов
/ 13 апреля 2020

У нас было точно та же проблема, мы используем gorm для разных приложений и с разными базами данных (PostgreSQL, MySQL и SQLite).

Мы naively решил абстрагировать gorm, используя то, что мы назвали Storage интерфейсом, этот интерфейс имеет более или менее базовые c операции, которые вам требуются от любого orm. Выглядело это так:

type Storage interface {
    Create(object interface{}) error
    Retrieve(object interface{}, queries ...Query) error
    Update(object interface{}) error
    Delete(object interface{}) error
}

В начале разработки это нам очень помогло, и мы могли даже реализовать этот интерфейс, используя обычный файл, и он просто работал бы.

НО

Через пару месяцев мы начали замечать его ограничения. В gorm есть операции, которые мы не можем сделать с помощью нашего интерфейса. Итак, очевидно, мы решили расширить интерфейс, чтобы иметь больше функциональности. Опять же, это дало нам еще пару месяцев, пока мы не поняли: единственный способ использовать все функциональные возможности gorm - предоставить интерфейс для всего, что предоставляет gorm, что не совсем то, почему мы начали писать этот пакет .

Поскольку этот интерфейс используется везде, мы решили в качестве временного решения расширить интерфейс и добавить функцию, которая возвращает объект gorm.DB, чтобы мы могли напрямую использовать его еще раз.

Мораль истории, я бы настоятельно рекомендовал не создавать такой интерфейс. Используйте время, чтобы помочь с разработкой gorm v2 , которая должна скоро появиться в соответствии с этой публикацией .

2 голосов
/ 13 апреля 2020

Я думаю, что обертывание такой сложной вещи, как gorm, является сложной задачей, и если вы не знаете, как к ней подойти, вам лучше избегать этого.

В общем, я бы предложил сначала выяснить, что вы хотите применить, и только потом решаете, как вы хотите это сделать, имея в виду четкие требования. Захват инструмента до того, как вы знаете, что именно вы хотите сделать, - это надежный способ сделать вещи хуже, а не лучше. Вот шаги, которые вы можете выполнить:

  1. Начните с документирования ваших стандартов кода и указания на них людей при проверке кода в случае их несоответствия;
  2. Автоматизируйте проверку всего, что можете формально проверять конвейеры непрерывной интеграции (действия GitHub, GitLabCI, TravisCI, CircleCI и тому подобное);
  3. Если и только если вышеперечисленные вещи не работают, посмотрите на создание своей собственной оболочки, которая бы принудительное использование определенного стиля для разработчиков.

    К последнему шагу у вас уже должно быть достаточно приличное понимание того, что именно отсутствует, и тогда будет гораздо проще понять, как это исправить.

...