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

如何在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()表示硬删除(不保留软删除标记)。

注意事项

  1. 若姓名不唯一,GetStudentByName只会返回第一条匹配记录,可根据需求调整为查询列表或给Name字段添加唯一约束。
  2. 生产环境中建议补充错误处理,比如查询时判断errors.Is(result.Error, gorm.ErrRecordNotFound)来处理记录不存在的场景。
  3. gorm.Model自带ID、CreatedAt、UpdatedAt、DeletedAt字段,GORM会自动维护这些字段的数值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 10:33:31