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")
})
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.