• 周三. 5 月 22nd, 2024

    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