golang查询数据返回json

2020-08-12  本文已影响0人  EasyNetCN

在使用xorm中,有直接的方法返回map[string]string,返回map[string]interface{}时,返回的不是实际数据类型,下面的代码用于数据同步,可以返回实际的数据类型

func GetQueryColumns(rows *sql.Rows) ([]string, map[string]string, error) {
    columnTypes, err := rows.ColumnTypes()

    if err != nil {
        return nil, nil, err
    }

    length := len(columnTypes)

    columns := make([]string, length)
    columnTypeMap := make(map[string]string, length)

    for i, ct := range columnTypes {
        columns[i] = ct.Name()
        columnTypeMap[ct.Name()] = ct.DatabaseTypeName()
    }

    return columns, columnTypeMap, nil
}
func QueryForInterface(db *sql.DB, sqlInfo string, args ...interface{}) ([]map[string]interface{}, error) {
    rows, err := db.Query(sqlInfo, args...)

    defer rows.Close()

    if err != nil {
        return nil, err
    }

    columns, columnTypeMap, err := GetQueryColumns(rows)

    if err != nil {
        return nil, err
    }

    columnLength := len(columns)
    cache := make([]interface{}, columnLength) 

    for index, _ := range cache { 
        var a interface{}
        cache[index] = &a
    }

    var list []map[string]interface{} //返回的切片

    for rows.Next() {
        _ = rows.Scan(cache...)

        item := make(map[string]interface{})

        for i, data := range cache {
            if ct, ok := columnTypeMap[columns[i]]; ok {
                if (ct == "VARCHAR" || ct == "DATETIME") && *data.(*interface{}) != nil {
                    item[columns[i]] = string((*data.(*interface{})).([]byte))
                } else {
                    item[columns[i]] = *data.(*interface{})
                }
            } else {
                item[columns[i]] = *data.(*interface{}) 
            }

        }

        list = append(list, item)
    }

    return list, nil
}
上一篇 下一篇

猜你喜欢

热点阅读