Gorm 用原生 sql 查问有两种形式:
// 第一种
type Result struct {
ID int
Name string
Age int
}
var result Result
db.Raw("SELECT id, name, age FROM users WHERE id = ?", 3).Scan(&result)
// 第二种
result := map[string]interface{}{}
db.Model(&User{}).First(&result)
// SELECT * FROM `users` ORDER BY `users`.`id` LIMIT 1
// 通用应用形式
rows, _ := db.Raw("select * from admin").Rows()
fmt.Println(rows)
res := scanRows2map(rows)
func scanRows2map(rows *sql.Rows) []map[string]string {res := make([]map[string]string, 0) // 定义后果 map
colTypes, _ := rows.ColumnTypes() // 列信息
var rowParam = make([]interface{}, len(colTypes)) // 传入到 rows.Scan 的参数 数组
var rowValue = make([]interface{}, len(colTypes)) // 接收数据一行列的数组
for i, colType := range colTypes {rowValue[i] = reflect.New(colType.ScanType()) // 跟据数据库参数类型,创立默认值 和类型
rowParam[i] = reflect.ValueOf(&rowValue[i]).Interface() // 跟据接管的数据的类型反射出值的地址}
// 遍历
for rows.Next() {rows.Scan(rowParam...) // 赋值到 rowValue 中
record := make(map[string]string)
for i, colType := range colTypes {if rowValue[i] == nil {record[colType.Name()] = ""
} else {record[colType.Name()] = Byte2Str(rowValue[i].([]byte))
}
}
res = append(res, record)
}
return res
}
// Byte2Str []byte to string
func Byte2Str(b []byte) string {return *(*string)(unsafe.Pointer(&b))
}