Skip to main content
 首页 » 编程设计

Golang ORM 快速入门教程

2022年07月19日110luoye11

本文学习如何使用Go-ORMGORM,通过示例展示与sqlite3数据交互。

ORM(Object Relationship Managers) 作为开发者与底层数据库技术之间的代理。它本质上让我们使用对象,就像我们通常会做的那样,而不必编写复杂的SQL语句。利用ORM可以在与数据库交互时有效减少编码复杂度。

环境准备与示例说明

安装GORM库

我们使用go get命令安装jinzhu/gorm:

go get -u github.com/jinzhu/gorm 

正确安装后即可以在项目中引入jinzhu/gorm

简单示例说明

下面我们搭建一个简单的web应用,通过REST API对用户信息(名称、邮箱)管理。首先描述go User struct:

type User struct { 
    gorm.Model 
    Name  string 
    Email string 
} 

我们定义了User实体模型,下面暴露API接口与SQLITE数据库交互,实现用户记录保存、修改、删除、查询服务。

API接口

现在我们创建简单API接口实现CRUD功能,利用gorilla/mux可以快速定义服务接口以及对应处理方法:

package main 
 
import ( 
    "fmt" 
    "log" 
    "net/http" 
 
    "github.com/gorilla/mux" 
) 
 
func home(w http.ResponseWriter, r *http.Request) { 
	w.Write([]byte("GORM 教程")) 
} 
 
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("/", home).Methods("GET") 
    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 教程") 
 
    // 处理请求地址 
    handleRequests() 
} 

现在运行程序:localhost:8081,可以在浏览器中看到输出结果。下面开始利用GORM与数据库交互。

SQLite3 数据库交互

初始化Schema

下面开始创建数据库,使用SQLite3 主要演示比较方便,可以轻松使用无需安装。

GORM通过调用db.AutoMigrate(&User{})可以自动创建User表,大大节省了写创建表语句:

// 初始化数据库、创建表 
func initialMigration() { 
    db, err := gorm.Open("sqlite3", "test.db") 
    if err != nil { 
        fmt.Println(err.Error()) 
        panic("failed to connect database") 
    } 
    defer db.Close() 
 
    // 创建User表 
    db.AutoMigrate(&User{}) 
} 
 
func main() { 
    fmt.Println("Go ORM 教程") 
 
    // 增加调用初始化函数 
    initialMigration() 
 
    handleRequests() 
} 

上面代码首先定义初始化函数创建数据库及User表,然后在main函数中调用实现数据库初始化。准备好之后我们开始实现CRUD的具体逻辑。

新增用户

现在更新newUser()函数代码,假如插入用户代码。我们需要从请求路径参数中解析出username、email,然后填充User对象。最后调用 db.Create(&User{Name: name, Email: email}) 插入sqlite数据库User表:

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") 
} 

修改用户

使用GORM可以轻松更新数据库记录,仅需要通过name查询到需要更新的用户,更新邮箱属性信息,最后调用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") 
} 

上面代码很直接,首先连接数据库、解析路径参数,然后通过name查询用户并更新其email属性,最后保存新用户信息。

删除用户

deleteUser 函数删除匹配name路径参数值的数据库记录。

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") 
} 

首先定义数据库连接,然后解析name路径参数,最后查询相同名称的用户并删除。这里为了简化没有考虑相同用户名问题。

查询用户

allUsers() 函数查询所有用户记录,然后编码为json作为响应返回。

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) 
} 

与前面逻辑一样,首先连接数据库,然后调用 db.Find(&users) 函数查询用户集合,最后编码用户集合作为响应信息。

总结

本文通过简单示例展示了GORM的使用,并通过gorilla/mux快速搭建WEB版用户信息管理。


本文参考链接:https://blog.csdn.net/neweastsun/article/details/123595746
阅读延展