V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
loneybw
V2EX  ›  Go 编程语言

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

  •  
  •   loneybw · 2022-11-06 20:23:46 +08:00 · 1485 次点击
    这是一个创建于 748 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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"
    1 条回复    2022-11-23 23:21:24 +08:00
    YuuuuuuH
        1
    YuuuuuuH  
       2022-11-23 23:21:24 +08:00
    牛逼, 已 star
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2740 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 678ms · UTC 06:11 · PVG 14:11 · LAX 22:11 · JFK 01:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.