go - Redshift 返回 []uint8 而不是整数,它们之间的转换返回不正确的值

标签 go amazon-redshift

我有一项服务接受 SQL 查询,使用数据库/sql 驱动程序在 Amazon Redshift 上运行查询。但是,我无法将结果转换为结构,因为查询是各种表上的大数据任务,而不是在此服务中创建的。所以我必须返回一个“松散”的数据结构。我正在将返回的数据解析为 JSON 并将其存储在 S3 中。

但是,我在返回的数据类型方面遇到了一些奇怪的问题。对于数字列的查询返回 uint8 的映射而不是数字值。我知道这是因为数据库驱动程序无法决定将其转换为什么,因为它可能不精确。但我似乎也无法在 []uint8 和整数之间进行转换。

这是我查询数据库的代码:

// Execute executes SQL commands
func (r *Runner) Execute(query string, args ...interface{}) (types.Results, error) {
    var results types.Results
    rows, err := r.db.Query(query, args...)
    if err != nil {
        return results, err
    }

    columns, _ := rows.Columns()
    colNum := len(columns)

    values := make([]interface{}, colNum)
    for i := range values {
        var ii interface{}
        values[i] = &ii
    }

    for rows.Next() {
        rows.Scan(values...)
        result := make(types.Result)
        for i, colName := range columns {
            rawValue := *(values[i].(*interface{}))
            if reflect.TypeOf(rawValue).String() == "[]uint8" {
                byteVal := rawValue.([]byte)
                val := Intfrombytes(byteVal)
                log.Println("Converted:", val)
            }
            result[colName] = rawValue
        }
        results = append(results, result)
    }
    return results, nil
}

我创建了以下函数来尝试在 []uint8uint32 之间进行转换。

func Intfrombytes(bytes []uint8) uint16 {
    bits := binary.LittleEndian.Uint16(bytes)
    return bits
}

但是,如果我将 200 插入该表,我将返回 12339。一般来说,这种方法感觉很不稳定。我怀疑我为此使用 Go 的决定,因为我正在处理未定义的、松散的数据结构。

是否有更好的方法来处理通用查询(例如我的示例),或者是否有方法可以将数字结果转换为整数?

最佳答案

我认为您实际上可能正在解释一个字符串 ([]uint8 == []byte)。参见 https://play.golang.org/p/Rfpey2NPiI7

originalValue := []uint8{0x32, 0x30, 0x30} // "200"
bValue := []byte(originalValue) // byte is a uint8 anyway
fmt.Printf("Converted to uint16: %d\n", binary.LittleEndian.Uint16(bValue))
fmt.Printf("Actual value: %s", string(bValue))

在处理 pq 和一些加密代码时,这让我很头疼。

关于go - Redshift 返回 []uint8 而不是整数,它们之间的转换返回不正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54988764/

相关文章:

sql - 从逗号分隔的字符串中删除重复项(Amazon Redshift)

apache-spark - 如何在 Amazon EMR 集群上使用 Spark 连接到 redshift 数据

sql - 批量更新 Redshift 中的现有行

pointers - atomic.AddInt64 导致无效的内存地址或零指针取消引用

json - 通过多个编码保留 json.RawMessage

sql - 在 Redshift 中有多个列的 WHERE IN

mysql - AWS Kinesis Firehose不在Redshift中插入数据

pointers - 非指针类型的指针方法

go protobuf : Cannot find package "." in github. com/gogo/protobuf/proto 和 m.TimeStamp.MarshalToSizedBuffer 未定义

go - 如何在golang中更改指针 slice