Один из самых многофункциональных ORM для Go, с которым я работал, — это Gorm. Если вы хотите узнать о нем больше, я рекомендую проверить его официальный сайт и его документацию.

Недавно я хотел написать небольшую абстракцию заполнения базы данных. Заполнение базы данных — это процесс, в котором начальный набор данных предоставляется базе данных при ее настройке или установке.

Тем не менее, в истинном стиле Go моя цель состояла в том, чтобы сохранить крошечную абстракцию, но при этом предоставить некоторую структуру людям, которые будут писать семена в этом приложении. Это абсолютно не единственный способ добиться этого, вариантов предостаточно. Тем не менее, это один из подходов, который, по моему мнению, хорошо работает.

У нас будет три разных компонента:

  1. Создайте Seed абстракцию.
  2. Определите путь для семян и как собрать их в один пакет seeds.
  3. Создайте инструмент командной строки seeder, который может запускать семена для базы данных.

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

// pkg/seed/seed.go
package seed

import (
	"github.com/jinzhu/gorm"
)

type Seed struct {
	Name string
	Run  func(*gorm.DB) error
}

Далее нам нужно определить путь, где мы будем хранить семена и как их собирать:

// pkg/seeds/seeds.go
package seeds

import (
	"github.com/fteem/seeding/pkg/seed"
)

func All() []seed.Seed {
	return []seed.Seed{}
}

Пакет seeds будет содержать все экземпляры seed.Seed и собирать их в функции All. Это позволит третьему компоненту, инструменту CLI, перебирать их и выполнять в базе данных. Кроме того, в одном и том же пакете seeds у нас могут быть отдельные файлы для заполнения различных типов данных.

Например:

// pkg/seeds/users.go
package seeds

func CreateUser(db *gorm.DB, name string, age int) error {
        return db.Create(&users.User{Name: name, Age: age}).Error
}

Использование функции в All:

// pkg/seeds/seeds.go
import (
	"github.com/fteem/seeding/pkg/seed"
)

func All() []seed.Seed {
	return []seed.Seed{
        	seed.Seed{
                        Name: "CreateJane",
                        Run: func(db *gorm.DB) error {
                              CreateUser(db, "Jane", 30)
                        },
                },
        	seed.Seed{
                        Name: "CreateJohn",
                        Run: func(db *gorm.DB) error {
                              CreateUser(db, "John", 30)
                        },
                },
        }
}

Приведенный выше пример надуманный, но он может работать очень хорошо, если вам нужно составить семя, используя несколько таких функций.

Наконец, очень простой инструмент командной строки, который может запускать определенные нами семена:

Двоичный файл, созданный этим, довольно прост: загружает все семена с помощью функции seeds.All, выполняет итерацию по коллекции и выполняет их функцию Run. Если возникает ошибка, вся программа бомбит.

Вот и все. Очень тонкий и простой способ абстрагироваться от семян вашей базы данных с помощью Gorm. Прежде чем уйти, дайте мне знать в комментариях, как вы подходите к заполнению базы данных.

Первоначально опубликовано на https://ieftimov.com 15 ноября 2019 г.