Один из самых многофункциональных ORM для Go, с которым я работал, — это Gorm. Если вы хотите узнать о нем больше, я рекомендую проверить его официальный сайт и его документацию.
Недавно я хотел написать небольшую абстракцию заполнения базы данных. Заполнение базы данных — это процесс, в котором начальный набор данных предоставляется базе данных при ее настройке или установке.
Тем не менее, в истинном стиле Go моя цель состояла в том, чтобы сохранить крошечную абстракцию, но при этом предоставить некоторую структуру людям, которые будут писать семена в этом приложении. Это абсолютно не единственный способ добиться этого, вариантов предостаточно. Тем не менее, это один из подходов, который, по моему мнению, хорошо работает.
У нас будет три разных компонента:
- Создайте
Seed
абстракцию. - Определите путь для семян и как собрать их в один пакет
seeds
. - Создайте инструмент командной строки
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 г.