使用golang 访问数据库遇到的异常 ,专家绕行
在测试多个编程语音访问数据库的脚本。使用golang 查询数据后,获取内容出错问题
panic: sql: expected 2 destination arguments in Scan, not 1
select 函数如下:
func sqlSelect() {
//
rows, err := db.Query("SELECT * FROM test1")
checkErr(err)
for rows.Next() {
var a int
err = rows.Scan(&a)
checkErr(err)
fmt.Println("a = ",a)
}
}
实际上 go_tab
里面有两个字段 ,查询函数封装的时候只是展示其中一个,select * 会产生2列数据。
解决方式一
for rows.Next() {
var a int
var b int
err = rows.Scan(&a,&b)
if err != nil {
log.Fatalln(err)
}
fmt.Println("a = ", a,"b = ", b )
}
解决方式二
如果字段比较多,有不想硬编码,可以使用下面的方式
func sqlSelect() {
rows, err := db.Query("select * from poc_tab")
if err != nil {
log.Fatalln(err)
}
// 获取字段
cols, _ := rows.Columns()
for i := range cols {
fmt.Print(cols[i])
fmt.Print("\t")
}
fmt.Println("\n==========================")
values := make([]sql.RawBytes, len(cols))
scans := make([]interface{}, len(cols))
for i := range values {
scans[i] = &values[i]
}
results := make(map[int]map[string]string)
i := 0
for rows.Next() {
if err := rows.Scan(scans...); err != nil {
fmt.Println("Error")
return
}
row := make(map[string]string)
for j, v := range values {
key := cols[j]
row[key] = string(v)
}
results[i] = row
i++
}
for i, m := range results {
fmt.Println(i)
for k, v := range m {
fmt.Println(k, " : ", v)
}
fmt.Println("========================")
}
}