Golang Go语言中 sqldb:一个利用泛型及反射简化数据库模型操作的库

发布于 1周前 作者 wuwangju 来自 Go语言

sqldb 简介

sqldb是一个用 Go 编写的,使用泛型以及反射简化数据库模型(Model)操作的库。 其利用泛型定义了一组在业务代码操作数据库模型时常用的方法:

type Model[T any] interface {
	Columns() T
	Create(ctx context.Context, entity *T) error
	Get(ctx context.Context, opts []OpQueryOption) (*T, error)
	List(ctx context.Context, opts ListOptions) ([]*T, uint64, error)
	Update(ctx context.Context, query FilterOptions, opts []UpdateOption) (uint64, error)
	Delete(ctx context.Context, opts FilterOptions) error
}

其中Columns()方法被用来获取模型各字段在数据库中的列名。 sqldb 同时使用Gorm库提供了对上述接口的一个实现。

使用

定义模型

type User struct {
	ID      sqldb.Column[uint64] `gorm:"column:id;primaryKey"`
	Name    sqldb.Column[string] `gorm:"column:user_name"`
	Age     sqldb.Column[*int]
	CreatedAt sqldb.Column[time.Time]
	DeletedAt sqldb.Column[gorm.DeletedAt]
}

利用泛型结构Column对模型各字段进行定义。

初始化并使用模型

import (
	"context"
"github.com/YLonely/sqldb"
sqlgorm "github.com/YLonely/sqldb/gorm"

)

func main(){ // 使用 gorm 打开并连接数据库 dsn := “user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local” db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil{ panic(err) }

// 初始化模型
var Users sqldb.Model[User] = sqlgorm.NewModel[User](db)
ctx := context.Background()

// 创建 User 实例
age := 10
u := &User{
	Name: sqldb.NewColumn("test"),
	Age: sqldb.NewColumn(&age),
}
_ = Users.Create(ctx, u)

// 使用 Get 方法获取 User 实例
u, err := Users.Get(ctx, []sqldb.OpQueryOption{
	{
    	// 使用 Columns().Name 引用 User 模型的 Name 字段
		Column: Users.Columns().Name
		Op: OpEq,
		Value: "test",
	}, //  或者可以使用预定义的构造方法 sqldb.NewEqualOption(Users.Columns().Name, "test")
})

}

亮点

  • 借助泛型为模型字段增加功能且不牺牲可读性
  • 提供一套可复用方法方便对各类模型进行操作
  • 提供 Columns()方法方便对模型的列进行引用,开发者无需判断实际的列名,无需在代码中书写"string literals"

Golang Go语言中 sqldb:一个利用泛型及反射简化数据库模型操作的库

更多关于Golang Go语言中 sqldb:一个利用泛型及反射简化数据库模型操作的库的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

牛逼, 已 star

更多关于Golang Go语言中 sqldb:一个利用泛型及反射简化数据库模型操作的库的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


针对帖子中提到的“Golang Go语言中sqldb:一个利用泛型及反射简化数据库模型操作的库”,作为IT营GO语言方面的专家,我认为以下几点值得探讨:

  1. 泛型与反射的结合:sqldb通过利用Golang的泛型及反射特性,能够实现对数据库模型操作的简化。泛型使得库能够处理不同类型的数据,而反射则允许库在运行时动态地检查和操作数据结构,这两者的结合大大增强了库的灵活性和通用性。
  2. 简化数据库操作:传统的数据库操作往往涉及繁琐的SQL语句编写和结果集处理,而sqldb通过提供简洁的API接口和高级查询构建器,使得开发者能够以更高效、更直观的方式进行数据库操作,从而减少了开发时间和成本。
  3. 性能与安全性:尽管sqldb通过泛型及反射简化了数据库操作,但开发者仍需关注其性能和安全性。例如,反射操作通常比直接代码执行要慢,且可能带来额外的安全风险。因此,在使用sqldb时,建议根据实际需求进行性能优化和安全审查。

综上所述,sqldb作为一个利用泛型及反射简化数据库模型操作的库,在Golang社区中具有一定的价值和意义。然而,开发者在使用时仍需谨慎,以确保其满足项目的性能和安全要求。

回到顶部