如何让我的 CRUD 功能在 GORM 中工作?

问题描述 投票:0回答:1

作为练习,我需要学习使用 GORM。具体来说,我需要在一个包中使用 CRUD 函数来获取 main.go 中的任务功能。我本身不需要完成整个练习,让一个函数正常工作并提供清晰的解释可能足以作为我的参考。这是我拥有的三个包中的代码以及一些随机的适当数据:

学生.go

package model

import "gorm.io/gorm"

type Student struct {
    gorm.Model
    Name   string
    Age    int
    City   string
    Adress string
}

func PrintStudents(students []Student) {
    for _, s := range students {
        println(s.Name, s.Age, s.City, s.Adress)
    }
}

main.go

package main

import (
    "fmt"
    task "gorm-basis"
    "gorm-basis/main/model"
)

func main() {
    task.InitDatabase(&model.Student{})

    // Create
    task.CreateStudent("Jan", 18, "Ede", "Dorpsweg 1")
    task.CreateStudent("Piet", 19, "Veenendaal", "Dorpsweg 2")
    task.CreateStudent("Klaas", 20, "Ede", "Dorpsweg 3")
    task.CreateStudent("Klaasje", 20, "Ede", "Dorpsweg 369552")

    // Read
    fmt.Println("Student Jan:")
    model.PrintStudents([]model.Student{task.GetStudentByName("Jan")})
    fmt.Println("All students:")
    model.PrintStudents(task.GetAllStudents())
    fmt.Println("All students from city Ede:")
    model.PrintStudents(task.GetStudentsByWoonplaats("Ede"))

    // Update - update the age of Jan to 19
    jan := task.GetStudentByName("Jan")
    jan.Age = 19
    task.UpdateStudent(jan)

    // Update - update the city of residence and the adress of the student with the name Piet
    piet := task.GetStudentByName("Piet")
    piet.City = "Amersfoort"
    piet.Adress = "Arnhemsestraat 16"
    task.UpdateStudent(piet)

    // Delete - delete product
    wrongEntry := task.GetStudentByName("Klaasje")
    task.DeleteStudent(wrongEntry)

}

任务.go

package task

import (
    "github.com/glebarez/sqlite"
    "gorm-basis/main/model"
    "gorm.io/gorm"
)

/*
*
De variabele db bestaat alleen in deze package. Deze variabele is een pointer naar een gorm.DB object.
Deze variabele is niet zichtbaar buiten deze package, zodat er maar één database connectie is.
Wil je deze toch van buiten de package kunnen benaderen, dan kan je de GetDBConnection() functie gebruiken.
*/
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()
}

/**
Implement the CRUD-functies for the Student struct under here.
*/

func CreateStudent(name string, age int, city string, adress string) error {

    return nil
}

func GetAllStudents() []model.Student {
    return nil
}

// This function there is only one student with one specific name.
func GetStudentByName(name string) model.Student {
    return model.Student{}
}

func GetStudentsByWoonplaats(city string) []model.Student {
    return nil
}

func UpdateStudent(student model.Student) {

}

func DeleteStudent(student model.Student) {

}

func DeleteAllStudents() {
    allStudents := GetAllStudents()
    for _, student := range allStudents {
        db.Unscoped().Delete(&student)
    }
}

我尝试翻译大部分术语,因为有些术语是荷兰语的。 Student.go 和 main.go 应该保持不变,练习在 task.go 中完成。

我尝试了几种方法来让它工作,每次我期望一个功能数据库时,但每次都会收到很多错误消息。

database go go-gorm
1个回答
0
投票

CreateStudent
为例:

func CreateStudent(name string, age int, city string, adress string) error {
    result := db.Create(&Student{Name: name, Age: age, City: city, Adress: adress})

    return result.Error
}

这里您只需要简单地调用

Create
,传递所需的
Student
实例并从结果中返回错误。

同样的方式更新学生(调用

Update
)和删除学生(调用
Delete
)。

要获得学生,您只需使用

Where
(可选)和
Find

附注如果出现错误,请尝试找出发生了什么。如果您不能在这里问问题

© www.soinside.com 2019 - 2024. All rights reserved.