1

我想我会尝试变得有点“聪明”并抽象一些我的样板 SQL 代码(使用 sqlx - https://github.com/jmoiron/sqlx)。这个想法是为代码提供一个函数指针来处理结果,以及产生行的 sql 字符串和 args。碰巧的是,只要我去掉“sqlArgs 接口”的东西,代码就可以正常工作,但是语句的“聪明”格式错误

sql:转换Exec参数$1类型:不支持类型[]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{}

}

我想我的代码实际上并没有通过调用传递用户 ID,而是传递了一个 []interface{},而 sql 包无法处理。不过,我不确定。无论如何,有没有办法实现这个想法?谢谢。

4

0 回答 0