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

2022-11-06 20:23:46 +08:00
 loneybw

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")
	})
}

亮点

1340 次点击
所在节点    Go 编程语言
1 条回复
YuuuuuuH
2022-11-23 23:21:24 +08:00
牛逼, 已 star

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/893132

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX