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
}
另外,建议添加错误检查并修复几个问题:
- 在
defer rows.Close()之前检查db.Queryx的错误 - 使用切片来返回所有结果,而不是只返回最后一个
- 检查
rows.Err()来捕获遍历过程中可能出现的错误
修改后的输出应该会显示正确的数据库值。

