通过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
相关产品推荐
相关产品推荐

