jmoiron / sqlx,... interface {},并抽象一些样板

时间:2017-10-28 20:14:41

标签: go sqlx

我以为我会尝试一点点"聪明"并抽象我的一些样板SQL代码(使用sqlx - https://github.com/jmoiron/sqlx)。我们的想法是为代码提供一个函数指针来处理结果,以及生成行的sql字符串和args。实际上,只要我删除了" sqlArgs接口"东西,但在"聪明的"使用语句

格式化错误

sql:转换Exec参数$ 1 type:unsupported type [] interface {},一个接口片

这是两个版本,第一个是错误,第二个是有效但没有参数化:

//GetRows (doesn't work)
func GetRows(parseRows func(*sqlx.Rows), sql string, sqlArgs ...interface{}) {
    db := sqlx.MustConnect("mysql", ConnString)

    defer db.Close()

    rows, err := db.Queryx(sql, sqlArgs)

    defer rows.Close()

    if err != nil {
        panic(err)
    }

    parseRows(rows)

}

//GetRows ... (works, but doesn't allow parameterization)
func GetRows(fp func(*sqlx.Rows), sql string) {

    db := sqlx.MustConnect("mysql", ConnString)

    defer db.Close()

    rows, err := db.Queryx(sql)

    defer rows.Close()

    if err != nil {
        panic(err)
    }

    fp(rows)

}

我们的想法是调用代码:

func getUser(userID string) User {

    var users []*User

    parseRows := func(rows *sqlx.Rows) {
        for rows.Next() {
            var u User
            err := rows.StructScan(&u)

            if err != nil {
                panic(err)
            }

            users = append(users, u)
        }
    }

    sql := "SELECT * FROM users WHERE userid = ?;"

    sqlutils.GetRows(parseRows, sql, userID)

    if len(users) == 1{
        return users[0]
    }

    return User{}

}

我想我的代码实际上并没有从调用到调用传递userID,而是传递了一个[]接口{},而sql包无法处理。但是,我不确定。无论如何,有没有办法实现这个想法?感谢。

0 个答案:

没有答案