func QueryRows(db *DB, sqlStr string, val ...interface{}) (list []map[string]interface{}, err error) {
var rows *sql.Rows
rows, err = db.Raw(sqlStr, val...).Rows()
if err != nil {
return
}
defer rows.Close()
var columns []string
columns, err = rows.Columns()
if err != nil {
return
}
values := make([]interface{}, len(columns))
scanArgs := make([]interface{}, len(values))
for i := range values {
scanArgs[i] = &values[i]
}
// 这里需要初始化为空数组,否则在查询结果为空的时候,返回的会是一个未初始化的指针
for rows.Next() {
err = rows.Scan(scanArgs...)
if err != nil {
return
}
ret := make(map[string]interface{})
for i, col := range values {
if col == nil {
ret[columns[i]] = nil
} else {
switch val := (*scanArgs[i].(*interface{})).(type) {
case byte:
ret[columns[i]] = val
break
case []byte:
v := string(val)
switch v {
case "\x00": // 处理数据类型为bit的情况
ret[columns[i]] = 0
case "\x01": // 处理数据类型为bit的情况
ret[columns[i]] = 1
default:
ret[columns[i]] = v
break
}
break
case time.Time:
if val.IsZero() {
ret[columns[i]] = nil
} else {
ret[columns[i]] = val.Format("2006-01-02 15:04:05")
}
break
default:
ret[columns[i]] = val
}
}
}
list = append(list, ret)
}
if err = rows.Err(); err != nil {
return
}
return
}
- 因此数据库表中某些列的类型是bit(1),所有需要在类型转换的时候处理一下
switch v {
case "\x00": // 处理数据类型为bit的情况
ret[columns[i]] = 0
case "\x01": // 处理数据类型为bit的情况
ret[columns[i]] = 1
default:
ret[columns[i]] = v
break
}