登录
首页 >  Golang >  Go问答

生成具有未导出字段的数据库实例 - sql.Row

来源:stackoverflow

时间:2024-02-11 19:39:24 193浏览 收藏

你在学习Golang相关的知识吗?本文《生成具有未导出字段的数据库实例 - sql.Row》,主要介绍的内容就涉及到,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的哦!

问题内容

我有一个关于 database/sql 包的 sql.row 的具有挑战性的 swe 问题。

我有以下界面:

type sqlquerier interface {
    queryrowcontext(ctx context.context, query string, args ...interface{}) *sql.row
}

sqlquerier 是一个具有 queryrowcontext 函数签名的接口。该功能由各种 sql 数据库客户端实现,例如 tx、sqlite3。

我有自己的类型:

func (db *XDB) QueryRowContext(ctx context.Context, query string, args ...interface{}) *sql.Row {
     // operation
     // check if the operation is successful, if not return error
     // otherwise return sql.Row result
     return db.innerDB.QueryRowContext(ctx, query, args...)
}

xdb 是 sqlx.db (db.innerdb) 的基础结构包装器,如果第一个操作成功,则调用它自己的 queryrowcontext 实现。

我的问题是我无法在 sql.row 结果中植入错误,因为:

  • 未导出的字段没有像 newrow 或 setter/getter 这样的工厂函数。
  • 返回 nil 不是一个很好的习惯,并且没有关于错误原因的明确指示。
  • 返回空的 sql.row{} 结构是有问题的,因为在之后尝试扫描其值时会出现恐慌.scan(...)。
  • 无法通过反射为未导出的字段设置值。
  • 另一个限制是,我无法更改函数签名以返回 (*sql.row, error),因为它对其他客户端有各种依赖性。

我愿意接受任何建议。


正确答案


警告 - 这很丑陋,而且不理想,我个人会想出一种不同的方式,但是你可以实现一个约定,如果你传递的最后一个参数是 *error,你将其指向的错误设置为您关心的错误

func (db *xdb) queryrowcontext(ctx context.context, query string, args ...interface{}) *sql.row {
        last := args[len(args)-1]
        argserr, hasargserr := last.(*error)
        if hasargserr {
            args = args[:len(args)-1]
        }
        // operation
        // check if the operation is successful, if not return error
        // otherwise return sql.row result
        if (err != nil && hasargserr) {
            (*argserr) = err
        }
        return db.innerdb.queryrowcontext(ctx, query, args...)
    }

然后你就可以做

var queryRowErr error
row := xdb.QueryRowContext(ctx, query, arg1, arg2, &queryRowErr)
if queryRowErr != nil {
    // do something with the error
}

理论要掌握,实操不能落!以上关于《生成具有未导出字段的数据库实例 - sql.Row》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>