ecodeclub / eorm

简单 ORM 框架
Apache License 2.0
194 stars 64 forks source link

eorm: Result 抽象 #94

Closed flycash closed 1 year ago

flycash commented 2 years ago

仅限中文

使用场景

目前来说,Inserter, Deleter #92 和 Updater #93 的 Exec 方法都会返回一个 (sql.Result, error), 但是实际上用起来很恶心:

res, err := i.Exec(ctx)
if err != nil {
    return nil, err
}
id, err := res.LastInsertId()
if err != nil {
    return nil, err
}
// id 处理一下 ID 啥的

所以这里就会出现两次 error 的判断。实际上我们完全可以考虑返回一个 sql.Result 的实现,类似于:

res := i.Exec(ctx)
id, err := res.LastInsertId()
if err != nil {

}

行业分析

这里面可以参考 sql.Row 结构:

// Row is the result of calling QueryRow to select a single row.
type Row struct {
    // One of these two will be non-nil:
    err  error // deferred error for easy chaining
    rows *Rows
}

也就是将原本的返回值 (*Rows, error) 封装成了一个结构体。

可行方案

定义一个我们自己的 Result 结构体:

type Result struct {
    err error
    res sql.Result
}

它会实现 sql.Result 接口,同时暴露一个 Err() 方法,用于返回 err 字段。

其它

你使用的是 eorm 哪个版本?

你设置的的 Go 环境?

上传 go env 的结果

goSilver commented 1 year ago

老师,我想尝试一下这个feature,是直接在main分支上开发吗?