Golang中sqlx库错误:*main.Hr结构缺少hr_id字段

Golang中sqlx库错误:*main.Hr结构缺少hr_id字段 我正在尝试使用结构体和StructScan(sqlx),但没有获取到任何值。只有结构体本身。

type Hr struct {
	hr_id   int     `db:"hr_id"`
	hr_sign string  `db:"hr_sign"`
	hr_code string  `db:"hr_code"`
	hr_sum  float64 `db:"hr_sum"`
}

func get(query string) interface{} {
	if len(query) > 0 {
		rows, err := db.Queryx("SELECT * FROM hr")
		defer rows.Close()
		fmt.Println(rows)

		hr := Hr{}
		for rows.Next() {
			err := rows.StructScan(&hr)
			if err != nil {
				log("next error" + err.Error())
			}
			fmt.Printf("%#v\n", hr)
		}

		if err != nil {
			log("get error" + err.Error())
		}
		return hr

	}
	return nil
}

结果是空的:

main.Hr{hr_id:0, hr_sign:"", hr_code:"", hr_sum:0} main.Hr{hr_id:0, hr_sign:"", hr_code:"", hr_sum:0}

并且在 log("next error" + err.Error()) 处我收到这个错误:

errormissing destination name hr_id in *main.Hr

我哪里做错了?


更多关于Golang中sqlx库错误:*main.Hr结构缺少hr_id字段的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

我认为你需要将字段名首字母大写,以便它们能够匹配。

type Hr struct {
    Hr_id   int     `db:"hr_id"`
    Hr_sign string  `db:"hr_sign"`
    Hr_code string  `db:"hr_code"`
    Hr_sum  float64 `db:"hr_sum"`
}

更多关于Golang中sqlx库错误:*main.Hr结构缺少hr_id字段的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


问题出在结构体字段的可见性上。在Go中,只有首字母大写的字段才能被外部包(如sqlx)访问。你的结构体字段都是小写开头,所以sqlx无法通过反射设置这些字段的值。

修改结构体,将字段名首字母大写:

type Hr struct {
    HrID   int     `db:"hr_id"`
    HrSign string  `db:"hr_sign"`
    HrCode string  `db:"hr_code"`
    HrSum  float64 `db:"hr_sum"`
}

同时更新代码中的引用:

func get(query string) interface{} {
    if len(query) > 0 {
        rows, err := db.Queryx("SELECT * FROM hr")
        if err != nil {
            log("query error: " + err.Error())
            return nil
        }
        defer rows.Close()

        var results []Hr
        hr := Hr{}
        for rows.Next() {
            err := rows.StructScan(&hr)
            if err != nil {
                log("scan error: " + err.Error())
                continue
            }
            fmt.Printf("%#v\n", hr)
            results = append(results, hr)
        }

        // 检查遍历过程中的错误
        if err = rows.Err(); err != nil {
            log("rows error: " + err.Error())
        }

        return results
    }
    return nil
}

另外,建议添加错误检查并修复几个问题:

  1. defer rows.Close()之前检查db.Queryx的错误
  2. 使用切片来返回所有结果,而不是只返回最后一个
  3. 检查rows.Err()来捕获遍历过程中可能出现的错误

修改后的输出应该会显示正确的数据库值。

回到顶部