Golang:如何正确处理动态 select 查询

Golang: how to proper handle dynamic select query

在 go 中处理 select sql 查询结果的最佳方式是什么?

上下文(这就是我到目前为止得到的...):

@更新

func (s *SQLServiceServer) select_query_func() {
    
    // db_connection and validation

    rows, err1 := db.Query(request.GetQuery())

    if err1 != nil {
        panic(err1)
    }

    defer rows.Close()

    columns, err2 := rows.Columns()

    if err2 != nil {
        panic(err2)
    }

    // Loop through rows, using Scan to assign column data to struct fields.
    for rows.Next() {
        values := make([]interface{}, len(columns))

        for i := range values {
            values[i] = new(interface{})
        }
        if err2 = rows.Scan(values...); err2 != nil {
            panic(err2)
        }

        for i := range values {
            fmt.Println(values[i])
        }
    }

    return requestOutput(REQUEST_OK, RESULT_OK, ERROR_NULL)
}

总而言之,最好的方法是什么?

我提到的错误

Scan 需要 allocated,即 non-nil,指针作为参数。允许以下类型:

*string
*[]byte
*int, *int8, *int16, *int32, *int64
*uint, *uint8, *uint16, *uint32, *uint64
*bool
*float32, *float64
*interface{}
*RawBytes
*Rows (cursor value) any type implementing Scanner (see Scanner docs)

因此,要修复您的代码,您需要使用 non-nil 指针填充 values 切片,并且为了您的目的,这些指针可以是 *interface{}.

类型
for rows.Next() {
    values := make([]interface{}, len(columns))
    for i := range values {
        values[i] = new(interface{})
    }
    if err := rows.Scan(values...); err != nil {
        return err
    }
}