七叶笔记 » golang编程 » Golang ORM教程

Golang ORM教程

(原文作者: Elliot Forbes )

在本教程中,我们将研究如何以一种简单的方式使用 Go-ORM GORM sqlite3 数据库进行交互。

ORM’s 对象关系管理器几乎充当我们开发人员与基础数据库技术之间的中介。它们使我们能够像通常那样在本质上使用对象的对象,然后保存这些对象而不必编写复杂的 SQL 语句。

在您不希望使用 SQL 但需要数据库的情况下,它们有效地降低了我们代码库的复杂性。

安装

为了安装 jinzhu/gorm ,您将必须执行以下 go get 命令:

 go get -u github.com/jinzhu/gorm
  

完成此操作后,您应该可以将导入 jinzhu/gorm 到任何基于go的项目中。

一个简单的例子

举例来说,假设您想编写一个go REST API,当某个API端点被命中时,它将新用户及其电子邮件保存到数据库中。

我们可以这样描述用户 struct

 // Our User Struct
type User struct {
    gorm.Model
    Name  string
    Email string
}
  

一旦定义了 User 模型,我们就可以公开一个API端点,该端点可以将新用户保存到我们的 sqlite3 数据库中。

我们的API

因此,我们将创建一个非常简单的API,该API具有4个不同的 CRUD 端点。这些将返回所有用户,添加新用户,删除用户并更新用户。

在我们的new的帮助下 GORM ,如果我们沿标准的原始 SQL 路线走下去,这些端点的创建应该比以前简单得多。

 package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/gorilla/mux"
)

func allUsers(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "All Users Endpoint Hit")
}

func newUser(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "New User Endpoint Hit")
}

func deleteUser(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Delete User Endpoint Hit")
}

func updateUser(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Update User Endpoint Hit")
}

func handleRequests() {
    myRouter := mux.NewRouter().StrictSlash(true)
    myRouter.HandleFunc("/users", allUsers).Methods("GET")
    myRouter.HandleFunc("/user/{name}", deleteUser).Methods("DELETE")
    myRouter.HandleFunc("/user/{name}/{email}", updateUser).Methods("PUT")
    myRouter.HandleFunc("/user/{name}/{email}", newUser).Methods("POST")
    log.Fatal(http.ListenAndServe(":8081", myRouter))
}


func main() {
    fmt.Println("Go ORM Tutorial")

    // Handle Subsequent requests
    handleRequests()
}
  

然后,我们可以通过运行来启动这个新的API go run main.go 。该API代表了我们用来构建 ORM 基础解决方案的基础。

SQLite3数据库创建和自动模式迁移

我们项目的下一步是创建数据库。就本教程而言, sqlite3 由于其易于使用和设置,我们将使用数据库。

注意- GORM通过切换方言,您可以相当轻松地交换使用另一种数据库技术。

我们可以 GORM 通过调用在数据库中自动创建User表 db.AutoMigrate(&User{}) 。这省去了编写表创建 SQL 脚本的麻烦。

 // our initial migration function
func initialMigration() {
    db, err := gorm.Open("sqlite3", "test.db")
    if err != nil {
        fmt.Println(err.Error())
        panic("failed to connect database")
    }
    defer db.Close()

    // Migrate the schema
    db.AutoMigrate(&User{})
}

func main() {
    fmt.Println("Go ORM Tutorial")

    // Add the call to our new initialMigration function
    initialMigration()

    handleRequests()
}
  

更新我们的所有用户端点

在我们的 allUsers() 函数中,我们基本上想查询 User 数据库中的所有记录,然后将其编码为编码 JSON 并将其作为响应返回。

我们可以通过调用查询数据库中的所有用户 db.Find(&users)

 func allUsers(w http.ResponseWriter, r *http.Request) {
    db, err := gorm.Open("sqlite3", "test.db")
    if err != nil {
        panic("failed to connect database")
    }
    defer db.Close()

    var users []User
    db.Find(&users)
    fmt.Println("{}", users)

    json.NewEncoder(w).Encode(users)
}
  

更新我们的新用户终端

现在,我们要更新我们的 newUser() 功能,以便它可以将新用户插入我们的数据库。这将需要根据向我们的API发出的请求的查询参数解析用户名和电子邮件。

这将必须解析端点的路径参数,然后使用这些路径参数来填充一个新 User 对象,然后 sqlite 通过调用,将其插入 数据库中, db.Create(&User{Name: name, Email: email}) 如下所示:

 func newUser(w http.ResponseWriter, r *http.Request) {
    fmt.Println("New User Endpoint Hit")

    db, err := gorm.Open("sqlite3", "test.db")
    if err != nil {
        panic("failed to connect database")
    }
    defer db.Close()

    vars := mux.Vars(r)
    name := vars["name"]
    email := vars["email"]

    db.Create(&User{Name: name, Email: email})
    fmt.Fprintf(w, "New User Successfully Created")
}

  

我们的删除用户端点

我们的 deleteUser() 函数将删除与 name 通过path参数传入的用户匹配的用户。这是相当基本的,不能处理数据库中存在多个用户且用户相同的情况,但是在该项目中它是一个很好的例子。

 func deleteUser(w http.ResponseWriter, r *http.Request) {
    db, err := gorm.Open("sqlite3", "test.db")
    if err != nil {
        panic("failed to connect database")
    }
    defer db.Close()

    vars := mux.Vars(r)
    name := vars["name"]

    var user User
    db.Where("name = ?", name).Find(&user)
    db.Delete(&user)

    fmt.Fprintf(w, "Successfully Deleted User")
}
  

我们的更新用户端点

在需要更新 user 数据库中现有数据的奇怪情况下,当然可以使用轻松得多 GORM 。从本质上讲,您要做的就是使用唯一的来搜索给定的用户 name

拥有该用户后,您只需 User 像通常使用标准go对象一样简单地更新对象。对对象和更新感到满意之后,您就可以调用 db.Save(&user) 将所有更改保存到数据库中。

 func updateUser(w http.ResponseWriter, r *http.Request) {
    db, err := gorm.Open("sqlite3", "test.db")
    if err != nil {
        panic("failed to connect database")
    }
    defer db.Close()

    vars := mux.Vars(r)
    name := vars["name"]
    email := vars["email"]

    var user User
    db.Where("name = ?", name).Find(&user)

    user.Email = email

    db.Save(&user)
    fmt.Fprintf(w, "Successfully Updated User")
}
  

完整的源代码

如果您需要该项目的完整源代码,请查看以下要点:https : //gist.github.com/elliotforbes/e241eaa8cc9d7bf3ec75b333e891d422

结论

希望您发现本教程有用,并且向您展示了在使用数据库时使用ORM的优势。如果这样做有帮助,或者您认为您需要进一步的帮助,请在下面的评论部分中告诉我!

原文地址:

相关文章