如何在GORM中实现Student结构体的CRUD函数(完善task.go)
GORM学生CRUD功能实现方案
需求:保持student.go和main.go代码不变,完善task.go中的CRUD函数,使main.go中的数据库操作功能正常运行。
以下是可直接运行的task.go完整实现:
package task import ( "github.com/glebarez/sqlite" "gorm-basis/main/model" "gorm.io/gorm" ) var db *gorm.DB func connectToDb() *gorm.DB { var err error db, err = gorm.Open(sqlite.Open("studenten.db"), &gorm.Config{}) if err != nil { panic(err) } return db } func GetDBConnection() *gorm.DB { return db } func createDatabase(model interface{}) { db.AutoMigrate(model) } func InitDatabase(model interface{}) { connectToDb() createDatabase(model) DeleteAllStudents() } // CreateStudent 创建新学生记录 func CreateStudent(name string, age int, city string, adress string) error { student := model.Student{ Name: name, Age: age, City: city, Adress: adress, } return db.Create(&student).Error } // GetAllStudents 查询所有学生记录 func GetAllStudents() []model.Student { var students []model.Student db.Find(&students) return students } // GetStudentByName 根据姓名查询单个学生(假设姓名唯一) func GetStudentByName(name string) model.Student { var student model.Student db.Where("name = ?", name).First(&student) return student } // GetStudentsByWoonplaats 根据城市查询学生列表 func GetStudentsByWoonplaats(city string) []model.Student { var students []model.Student db.Where("city = ?", city).Find(&students) return students } // UpdateStudent 更新学生记录 func UpdateStudent(student model.Student) { db.Save(&student) } // DeleteStudent 删除指定学生记录 func DeleteStudent(student model.Student) { db.Delete(&student) } // DeleteAllStudents 删除所有学生记录(优化为批量删除,更高效) func DeleteAllStudents() { db.Unscoped().Delete(&model.Student{}) }
关键实现说明
- CreateStudent:构造
Student实例,调用db.Create()插入数据库,返回操作错误(匹配原函数定义的返回要求)。 - GetAllStudents:使用
db.Find()查询所有学生,将结果存入切片返回。 - GetStudentByName:通过
Where指定姓名条件,First查询第一条匹配记录(符合注释中“姓名唯一”的假设)。 - GetStudentsByWoonplaats:用
Where指定城市条件,Find查询所有匹配的学生列表。 - UpdateStudent:调用
db.Save(),GORM会根据结构体中gorm.Model自带的ID字段自动定位并更新对应记录。 - DeleteStudent:调用
db.Delete(),根据学生实例的ID删除对应记录。 - DeleteAllStudents:优化为直接批量删除所有学生记录,比原循环删除更高效,
Unscoped()表示硬删除(不保留软删除标记)。
注意事项
- 若姓名不唯一,
GetStudentByName只会返回第一条匹配记录,可根据需求调整为查询列表或给Name字段添加唯一约束。 - 生产环境中建议补充错误处理,比如查询时判断
errors.Is(result.Error, gorm.ErrRecordNotFound)来处理记录不存在的场景。 gorm.Model自带ID、CreatedAt、UpdatedAt、DeletedAt字段,GORM会自动维护这些字段的数值。
内容的提问来源于stack exchange,提问作者Silverfoot
相关产品推荐
相关产品推荐

