GORM Gen使用介绍

// 安装Gen Tool

go install gorm.io/gen/tools/gentool@latest

 

// (在项目根目录下执行)根据数据库表生成对应仓储层代码

gentool -db mysql -dsn "username:passwd@tcp(db_ip:3306)/database_name?charset=utf8mb4&parseTime=True&loc=Local" -outPath ./internal/repo/query -modelPkgName domain -tables "table_1,table_2,table_3"

根据command和图片可以看到,domainquery是生成对应文件的目录,你可以调整指令来自主命名包,这两个包所在的路径是./internal/repo,也可以通过调整指令修改。

 

go mod引入gorm gen依赖

go get -u gorm.io/gen

 

使用:

func UserDI() *user_hdl.UserHandler {
    q := query.Use(database.MysqlClient)
    svc := &user_svc.UserService{Q: q}
    hdl := &user_hdl.UserHandler{Service: svc}
    return hdl
}

 

func (s *UserService) GetUsers() ([]*domain.WsjUser, error) {
    queryBuilder := s.Q.WsjUser.WithContext(global.Ctx)
    fieldModel := s.Q.WsjUser
    //first, err := queryBuilder.Where(fieldModel.Status.Eq("active")).First()
    //if err != nil {
    // return nil, err
    //}
    users, err := queryBuilder.Where(fieldModel.Status.Eq("active")).Find()
    if err != nil {
       return nil, err
    }
    return users, nil
}

 

func (s *UserService) GetUsers() ([]*domain.WsjUser, error) {
	queryBuilder := s.Q.WsjUser.WithContext(global.Ctx)
	fieldModel := s.Q.WsjUser

	// 组装嵌套括号
	conditions := field.And(
		field.Or(
			fieldModel.Status.Eq("inactive"),
			fieldModel.Email.IsNull(),
		),
		fieldModel.ID.Eq(1),
	)
	users, err := queryBuilder.Where(conditions).Find()
	if err != nil {
		return nil, err
	}
	return users, nil
}

 

func (s *UserService) QueryUsers(c *gin.Context) ([]*domain.WsjUser, error) {
	queryBuilder := s.Q.WsjUser.WithContext(c)
	fieldModel := s.Q.WsjUser

	var conditions []gen.Condition

	// 动态拼接条件示例
	if global.Flag {
		conditions = append(conditions, fieldModel.ID.Eq(3))
		changeFlag()
	} else {
		// 创建两个或条件
		orCon := field.Or(
			fieldModel.Email.IsNull(),
			fieldModel.Status.Eq("inactive"), // 假设你想添加另一个条件
		)
		conditions = append(conditions, orCon)
		changeFlag()
	}
	var users []*domain.WsjUser
	var err error
	if len(conditions) > 0 {
		users, err = queryBuilder.Where(conditions...).Find()
	} else {
		users, err = queryBuilder.Find()
	}

	if err != nil {
		return nil, err
	}
	return users, nil
}

func changeFlag() {
	if global.Flag {
		global.Flag = !global.Flag
	} else {
		global.Flag = !global.Flag
	}
}

 

后记

关于gorm gen,个人认为更像是对MybatisPlus这类orm框架的一种模仿,也违背了Golang轻量的设计,让(操作数据库)写SQL变得复杂且麻烦。

当然优点也不容忽视:比如编译安全,不会出现字段名出错的问题,数据库 Schema 或 Go Model 发生变化时,你只需要重新运行 GORM Gen 命令,不需要(在项目中)一个一个地方改数据库表所对应的结构体。

正如有句话说的那样——复杂度不会消失,只会转移。

posted @ 2025-05-10 22:57  Ashe|||^_^  阅读(311)  评论(0)    收藏  举报