You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GIN框架GET请求获取PostgreSQL数据时某字段为空问题求助

问题原因及解决方法

问题原因

你的Source结构体中,对应数据库abbreviation字段的成员变量拼写错误:

  • 数据库字段名是abbreviation
  • 结构体里写成了Abrviation(缺少字母e)

GORM默认会将结构体的驼峰命名转换为下划线分隔的数据库字段名,因此Abrviation会被映射到数据库的abrviation字段,但你的数据库中不存在这个字段,导致查询时无法获取对应值,返回空字符串。

解决方法

有两种可行的修复方式:

方式一:修正结构体字段名的拼写

直接修正结构体成员变量的拼写,让GORM自动匹配数据库字段:

type Source struct {
    ID            int       `json:"id"`
    Source_Name   string    `json:"source_name"`
    Abbreviation  string    `json:"abbreviation"` // 修正拼写,添加缺失的e
    Last_Modified time.Time `json:"last_modified"`
}

这样GORM会自动将Abbreviation映射到数据库的abbreviation字段,查询时就能正确获取值。

方式二:通过GORM tag指定数据库字段名

如果不想修改结构体字段名,可以在tag中明确指定对应的数据库字段:

type Source struct {
    ID            int       `json:"id"`
    Source_Name   string    `json:"source_name"`
    Abrviation    string    `json:"abrviation" gorm:"column:abbreviation"` // 指定数据库字段名
    Last_Modified time.Time `json:"last_modified"`
}

通过gorm:"column:abbreviation"强制指定该结构体成员对应数据库的abbreviation字段,也能解决字段不匹配的问题。

额外优化建议

建议在查询时添加错误判断,避免无数据时返回空结构体的情况:

import "errors"

func GetSource(db *gorm.DB) gin.HandlerFunc {
    return func(c *gin.Context) {
        id := c.Param("id")
        var source models.Source
        result := db.Where("id = ?", id).First(&source) // 使用First替代Find,更适合单条查询
        if result.Error != nil {
            if errors.Is(result.Error, gorm.ErrRecordNotFound) {
                c.JSON(http.StatusNotFound, gin.H{"error": "source not found"})
                return
            }
            c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to query source"})
            return
        }

        c.JSON(http.StatusOK, source)
    }
}

内容的提问来源于stack exchange,提问作者Campbell Padgett

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 11:57:10