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)
}
代码说明
-
模型定义:首先定义了一个User模型结构体,包含基本的用户字段。
-
Seeder实现:
- 创建UsersSeeder结构体继承SeederAbstract
- 实现Seed()方法用于生成测试数据
- 实现Clear()方法用于清理测试数据
-
使用流程:
- 初始化数据库连接
- 创建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
核心特性
- 简单易用的API
- 支持关联数据的生成
- 可配置的随机数据生成
- 支持事务处理
- 可扩展的种子逻辑
基本用法
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)
}
}
最佳实践
- 分离种子逻辑:为每个模型创建单独的种子文件
- 使用事务:在种子执行中使用事务确保数据一致性
- 环境判断:只在开发和测试环境执行种子
- 数据清理:实现Clear方法以便测试后清理数据
- 合理配置数量:根据需求配置生成的数据量
总结
Gorm-Seeder提供了一种简单高效的方式来生成数据库种子数据,特别适合在开发和测试阶段使用。通过其灵活的API和Faker集成,可以快速生成各种测试场景所需的数据,大大提高了开发效率。
对于更复杂的需求,你还可以扩展SeederAbstract结构体,添加自定义的种子逻辑。