golang简单高效的Gorm ORM数据库种子数据生成插件gorm-seeder的使用

Golang简单高效的Gorm ORM数据库种子数据生成插件gorm-seeder的使用

简介

gorm-seeder是一个简单的Gorm种子数据生成包,可以帮助开发者快速生成测试数据。

安装

go get -u github.com/kachit/gorm-seeder

使用示例

下面是一个完整的使用示例,展示了如何使用gorm-seeder生成用户测试数据:

package main

import (
    "fmt"
    "github.com/kachit/gorm-seeder"
    "gorm.io/driver/postgres"
    "gorm.io/gorm"
    "time"
)

// 定义用户模型
type User struct {
    Id          uint64 `json:"id" gorm:"primaryKey"`
    Name        string `json:"name"`
    Email       string `json:"email"`
    Password    string `json:"password"`
    CreatedAt   time.Time `json:"created_at"`
}

func (u *User) BeforeCreate(tx *gorm.DB) (err error) {
    u.CreatedAt = time.Now().UTC()
    return
}

// 重写表名
func (User) TableName() string {
    return "users"
}

// 创建新的seeder实例,实现gorm_seeder.SeederInterface接口
type UsersSeeder struct {
    gorm_seeder.SeederAbstract
}

func NewUsersSeeder(cfg gorm_seeder.SeederConfiguration) UsersSeeder {
    return UsersSeeder{gorm_seeder.NewSeederAbstract(cfg)}
}

// 实现Seed方法
func (s *UsersSeeder) Seed(db *gorm.DB) error {
    var users []User
    for i := 0; i < s.Configuration.Rows; i++ {
        indexStr := fmt.Sprint(i)
        user := User{
            Name: "Name LastName" + indexStr,
            Email: "foo" + indexStr + "@bar.gov",
            Password: "password-hash-string" + indexStr,
        }
        users = append(users, user)
    }
    return db.CreateInBatches(users, s.Configuration.Rows).Error
}

// 实现Clear方法
func (s *UsersSeeder) Clear(db *gorm.DB) error {
    entity := User{}
    return s.SeederAbstract.Delete(db, entity.TableName())
}

func main(){
    // 初始化数据库连接
    db, _ := gorm.Open(postgres.New(postgres.Config{
        DSN: "DSN connection string",
    }))

    // 构建seeders栈
    usersSeeder := NewUsersSeeder(gorm_seeder.SeederConfiguration{Rows: 10})
    seedersStack := gorm_seeder.NewSeedersStack(db)
    seedersStack.AddSeeder(&usersSeeder)

    // 执行种子数据生成
    err := seedersStack.Seed()
    fmt.Println(err)

    // 执行数据清理
    err = seedersStack.Clear()
    fmt.Println(err)
}

代码说明

  1. 模型定义:首先定义了一个User模型结构体,包含基本的用户字段。

  2. Seeder实现

    • 创建UsersSeeder结构体继承SeederAbstract
    • 实现Seed()方法用于生成测试数据
    • 实现Clear()方法用于清理测试数据
  3. 使用流程

    • 初始化数据库连接
    • 创建seeder实例并配置生成的行数
    • 将seeder添加到seeders栈
    • 调用Seed()生成数据或Clear()清理数据

这个插件简单易用,可以帮助开发者快速生成测试数据,特别适合在开发和测试阶段使用。


更多关于golang简单高效的Gorm ORM数据库种子数据生成插件gorm-seeder的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang简单高效的Gorm ORM数据库种子数据生成插件gorm-seeder的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Gorm-Seeder: 简单高效的Gorm数据库种子数据生成插件

Gorm-Seeder是一个为Golang Gorm ORM设计的数据库种子数据生成工具,它可以帮助开发者在开发和测试阶段快速填充数据库测试数据。

安装

go get github.com/kristijorgji/gorm-seeder

核心特性

  1. 简单易用的API
  2. 支持关联数据的生成
  3. 可配置的随机数据生成
  4. 支持事务处理
  5. 可扩展的种子逻辑

基本用法

1. 创建种子结构体

package seeders

import (
	"github.com/kristijorgji/gorm-seeder"
	"gorm.io/gorm"
	"your_project/models"
)

type UsersTableSeeder struct {
	gorm_seeder.SeederAbstract
}

func NewUsersTableSeeder(cfg gorm_seeder.SeederConfiguration) UsersTableSeeder {
	return UsersTableSeeder{
		gorm_seeder.NewSeederAbstract(cfg),
	}
}

func (s *UsersTableSeeder) Seed(db *gorm.DB) error {
	users := []models.User{
		{
			Name:  "John Doe",
			Email: "john@example.com",
			Age:   30,
		},
		{
			Name:  "Jane Smith",
			Email: "jane@example.com",
			Age:   25,
		},
	}
	
	return db.Create(&users).Error
}

func (s *UsersTableSeeder) Clear(db *gorm.DB) error {
	return db.Exec("DELETE FROM users").Error
}

2. 使用种子

package main

import (
	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
	"your_project/seeders"
)

func main() {
	db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
	if err != nil {
		panic("failed to connect database")
	}

	// 创建种子配置
	cfg := gorm_seeder.SeederConfiguration{
		Rows: 10, // 生成10条记录
	}

	// 初始化种子
	userSeeder := seeders.NewUsersTableSeeder(cfg)

	// 执行种子
	err = userSeeder.Seed(db)
	if err != nil {
		panic(err)
	}
}

高级用法

1. 使用Faker生成随机数据

func (s *UsersTableSeeder) Seed(db *gorm.DB) error {
	faker := s.GetFaker()
	var users []models.User

	for i := 0; i < s.Configuration.Rows; i++ {
		user := models.User{
			Name:  faker.Person().Name(),
			Email: faker.Internet().Email(),
			Age:   uint(faker.IntBetween(18, 80)),
		}
		users = append(users, user)
	}

	return db.Create(&users).Error
}

2. 关联数据种子

type PostsTableSeeder struct {
	gorm_seeder.SeederAbstract
}

func (s *PostsTableSeeder) Seed(db *gorm.DB) error {
	faker := s.GetFaker()
	var posts []models.Post

	// 获取已存在的用户ID
	var userIds []uint
	db.Model(&models.User{}).Pluck("id", &userIds)

	for i := 0; i < s.Configuration.Rows; i++ {
		post := models.Post{
			Title:    faker.Lorem().Sentence(5),
			Content:  faker.Lorem().Paragraph(3),
			AuthorID: userIds[faker.IntBetween(0, len(userIds)-1)],
		}
		posts = append(posts, post)
	}

	return db.Create(&posts).Error
}

3. 批量执行种子

func main() {
	db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
	if err != nil {
		panic("failed to connect database")
	}

	cfg := gorm_seeder.SeederConfiguration{Rows: 10}

	seedersStack := gorm_seeder.NewSeedersStack(db)
	seedersStack.AddSeeder(seeders.NewUsersTableSeeder(cfg))
	seedersStack.AddSeeder(seeders.NewPostsTableSeeder(cfg))

	err = seedersStack.Seed()
	if err != nil {
		panic(err)
	}
}

最佳实践

  1. 分离种子逻辑:为每个模型创建单独的种子文件
  2. 使用事务:在种子执行中使用事务确保数据一致性
  3. 环境判断:只在开发和测试环境执行种子
  4. 数据清理:实现Clear方法以便测试后清理数据
  5. 合理配置数量:根据需求配置生成的数据量

总结

Gorm-Seeder提供了一种简单高效的方式来生成数据库种子数据,特别适合在开发和测试阶段使用。通过其灵活的API和Faker集成,可以快速生成各种测试场景所需的数据,大大提高了开发效率。

对于更复杂的需求,你还可以扩展SeederAbstract结构体,添加自定义的种子逻辑。

回到顶部