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

通过gorm操作PostgreSQL数据库无法读写数据问题求助

代码错误点与修复方案

1. 插入操作参数错误

运行日志中已经明确报错using unaddressable value,原因是GORM的Create方法要求传入结构体指针,你当前传的是值类型:

// 错误写法
result := DB.Model(&Student{}).Create(tempMap)
// 正确写法,传入tempMap的指针
result := DB.Create(&tempMap)

同时你没有判断操作返回的Error,无法第一时间感知到执行失败,建议补充错误判断:

if result.Error != nil {
    fmt.Println("写入失败:", result.Error)
}

2. 缺少表结构同步逻辑

GORM不会自动为你创建表结构,你需要在Open连接成功后调用AutoMigrate同步结构体和表结构:

func Open() error {
    var err error
    DB, err = gorm.Open("postgres", "host=127.0.0.1 port=5433 user=postgres dbname=student password=postgres sslmode=disable")
    if err != nil {
        return err
    }
    // 新增同步表结构代码
    DB.AutoMigrate(&Student{})
    return nil
}

如果你的表名不是默认的students,还需要给Student结构体实现TableName方法手动指定表名。

3. 查询逻辑错误

你当前的GetAllFromDB存在两个问题:

  • 用来接收结果的是单个Student结构体,无法接收多条数据,应该用切片类型
  • 函数返回的是*gorm.DB查询对象,不是实际的查询结果,你主函数打印的其实是GORM的内置对象而非数据
    修正后的代码:
// 返回Student切片和错误信息
func GetAllFromDB() ([]Student, error) {
    var st []Student
    result := DB.Find(&st)
    return st, result.Error
}

主函数调用部分也要同步修改:

data, err := database.GetAllFromDB()
if err != nil {
    fmt.Println("查询失败:", err)
}
fmt.Println("Data from DB", data)

4. 字段类型不匹配

PhoneNumber字段你定义的是int类型,但是gorm标签指定的是varchar类型,数据库存储的时候会出现类型不匹配问题,建议统一类型:

// 方案1:改成string类型匹配varchar标签
PhoneNumber string `gorm:"type:varchar" json:"phone_number"`
// 方案2:改成int类型的标签匹配字段类型
PhoneNumber int `gorm:"type:int" json:"phone_number"`

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 02:48:03