У нас было точно та же проблема, мы используем 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 , которая должна скоро появиться в соответствии с этой публикацией .