• 周五. 11 月 13th, 2026

get failed, err:scannable dest type struct with >1 columns (3) in result

由root

2 月 7, 2021 #sqlx

在学习Go语言中,我遇到了如标题的错误信息,找了各种搜索引擎,思考了几天,终于尝试出问题出在哪儿? 下边是我的错误代码

package main

import (
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"github.com/jmoiron/sqlx"
)

type user struct {
	id int
	name string
	age int
}

var db *sqlx.DB

func init() {
	var err error
	dsn := "user:123456@tcp(127.0.0.1:3306)/sql_test?charset=utf8mb4&parseTime=True"
	db, err = sqlx.Connect("mysql", dsn)
	if err != nil {
		fmt.Printf("connect DB failed, err:%v\n", err)
		return
	}
	//设置与数据库建立连接的最大数目
	db.SetMaxOpenConns(20)
	//设置连接池中的最大闲置连接数
	db.SetMaxIdleConns(10)
}

func queryRowDemo(id int) {
	sql := "select `id`,`name`,`age` from user where id=?"
	var u user
	err := db.Get(&u, sql, id)
	if err != nil {
		fmt.Printf("get failed, err:%v\n", err)
		return
	}
	fmt.Printf("id:%d, name:%s, age:%d\n", u.id, u.name,u.age)

}

func main() {
	queryRowDemo(2)
}

下边贴出我的修正代码

package main

import (
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"github.com/jmoiron/sqlx"
)

type User struct {
	Id int
	Name string
	Age int
}

var db *sqlx.DB

func init() {
	var err error
	dsn := "user:123456@tcp(127.0.0.1:3306)/sql_test?charset=utf8mb4&parseTime=True"
	db, err = sqlx.Connect("mysql", dsn)
	if err != nil {
		fmt.Printf("connect DB failed, err:%v\n", err)
		return
	}
	//设置与数据库建立连接的最大数目
	db.SetMaxOpenConns(20)
	//设置连接池中的最大闲置连接数
	db.SetMaxIdleConns(10)
}

func queryRowDemo(id int) {
	sql := "select `id`,`name`,`age` from user where id=?"
	var u User
	err := db.Get(&u, sql, id)
	if err != nil {
		fmt.Printf("get failed, err:%v\n", err)
		return
	}
	fmt.Printf("id:%d, name:%s, age:%d\n", u.Id, u.Name,u.Age)

}

func main() {
	queryRowDemo(2)
}

可以从代码中发现, 结构体user的访问限制改为全局(即大写)。 这里我们可以理解了,当db.Get(&u,sql,id)执行时,sqlx包中会访问结构体u中的各字段,这时发现字段全部为小写,不可访问,即报错了。我们修改为大写即解决了问题。

由 root