网上很多go操作数据库的,对数据库的查询大多需要通过结构体来绑定返回数据库字段,对于正常go对mysql查询业务来讲这个没毛病,相比python执行查询语句直接返回所有信息,go的这种通过结构体来查询属实有的麻烦。当然go也能实现python查询这种返回集,网上基本上都查不到这种方式。国内外的文章都翻过,最终还是在国内找到一篇(抱歉,忘记出处了,若有师傅找到出处记得告知一下,还是标注一下出处,当时只是记录了一下语句)。因为要写点东西,所以就到处查了些资料,于是在此基础上做了些更改,写出来记录一下。
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
"log"
)
func main() {
//连接数据库查询
db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/dvwa")
if err != nil {
log.Fatal(err.Error())
}
cmd := "select * from users"
rows, err := db.Query(cmd)
if err == nil {
var result [2][64]string
columns, _ := rows.Columns()
for i := range columns {
result[0][i] = columns[i]
}
//获取字段名
for i := range columns {
if i == len(columns)-1 {
fmt.Print(columns[i])
} else {
fmt.Print(string(columns[i]) + ",")
}
}
//定义一个切片,长度是字段的个数,切片里面的元素类型是sql.RawBytes
values := make([]sql.RawBytes, len(columns))
//定义一个切片,元素类型是interface{} 接口
scanArgs := make([]interface{}, len(values))
for i := range values {
//把sql.RawBytes类型的地址存进去了
scanArgs[i] = &values[i]
}
//获取字段值
for rows.Next() {
rows.Scan(scanArgs...)
fmt.Print("\n")
for i, col := range values {
if i != len(columns)-1 {
fmt.Print(string(col) + ",")
} else {
fmt.Print(string(col))
}
}
}
rows.Close()
} else {
fmt.Print(err.Error())
}
//最终关闭数据库
defer db.Close()
}