Go-ORM 和 GORM是golang下常用的两个针对关系型数据库封装的库文件,这个类似于python 下的SQLAlchemy模块。其简化了再在代码里写SQL语句的过程。本篇就结合golang + gorm + sqlite实现一个简单的web api操作。操作之前,可以先使用如下命令安装gorm模块。

1go get -u github.com/jinzhu/gorm

一、不使用数据库时的需求

这里同样以一个简单的增删改查为例,在不使用数据库时,其代码关系可能如下:

 1package main
 2import (
 3    "fmt"
 4    "log"
 5    "net/http"
 6    "github.com/gorilla/mux"
 7)
 8func allUsers(w http.ResponseWriter, r *http.Request) {
 9    fmt.Fprintf(w, "All Users Endpoint Hit")
10}
11func newUser(w http.ResponseWriter, r *http.Request) {
12    fmt.Fprintf(w, "New User Endpoint Hit")
13}
14func deleteUser(w http.ResponseWriter, r *http.Request) {
15    fmt.Fprintf(w, "Delete User Endpoint Hit")
16}
17func updateUser(w http.ResponseWriter, r *http.Request) {
18    fmt.Fprintf(w, "Update User Endpoint Hit")
19}
20func handleRequests() {
21    myRouter := mux.NewRouter().StrictSlash(true)
22    myRouter.HandleFunc("/users", allUsers).Methods("GET")
23    myRouter.HandleFunc("/user/{name}", deleteUser).Methods("DELETE")
24    myRouter.HandleFunc("/user/{name}/{email}", updateUser).Methods("PUT")
25    myRouter.HandleFunc("/user/{name}/{email}", newUser).Methods("POST")
26    log.Fatal(http.ListenAndServe(":8081", myRouter))
27}
28func main() {
29    fmt.Println("Go ORM Tutorial")
30    // Handle Subsequent requests
31    handleRequests()
32}

二、数据库操作

我们先创建一个数据结构如下:

1// Our User Struct
2type User struct {
3    gorm.Model
4    Name  string
5    Email string
6}

1、初始化数据库

接下来我们创建一个初始化的数据库操作函数。这就不需要用sqlite3 数据库名,再进行表创建。而是直接使用GORM调用db.AutoMigrate(&User{})函数进行表的创建。代码如下:

 1// our initial migration function
 2func initialMigration() {
 3    db, err := gorm.Open("sqlite3", "test.db")
 4    if err != nil {
 5        fmt.Println(err.Error())
 6        panic("failed to connect database")
 7    }
 8    defer db.Close()
 9    // Migrate the schema
10    db.AutoMigrate(&User{})
11}
12func main() {
13    fmt.Println("Go ORM Tutorial")
14    // Add the call to our new initialMigration function
15    initialMigration()
16    handleRequests()
17}

2、查询所有用户

创建一个allUsers()方法,其会连接数据库的相关表,使用db.Find(&users)方法返回所有的数据,再使用json模板,以json的格式进行返回,代码如下:

 1func allUsers(w http.ResponseWriter, r *http.Request) {
 2    db, err := gorm.Open("sqlite3", "test.db")
 3    if err != nil {
 4        panic("failed to connect database")
 5    }
 6    defer db.Close()
 7    var users []User
 8    db.Find(&users)
 9    fmt.Println("{}", users)
10    json.NewEncoder(w).Encode(users)
11}

3、新增用户

创建newUser()方法,增加一个新增用户的方法,使用的db方法为:db.Create(&User{Name: name, Email: email}) ,具体代码如下:

 1func newUser(w http.ResponseWriter, r *http.Request) {
 2    fmt.Println("New User Endpoint Hit")
 3    db, err := gorm.Open("sqlite3", "test.db")
 4    if err != nil {
 5        panic("failed to connect database")
 6    }
 7    defer db.Close()
 8    vars := mux.Vars(r)
 9    name := vars["name"]
10    email := vars["email"]
11    db.Create(&User{Name: name, Email: email})
12    fmt.Fprintf(w, "New User Successfully Created")
13}

4、删除用户

创建deleteUser()方法,其会通过用户进行数据条目的删除,代码如下:

 1func deleteUser(w http.ResponseWriter, r *http.Request) {
 2    db, err := gorm.Open("sqlite3", "test.db")
 3    if err != nil {
 4        panic("failed to connect database")
 5    }
 6    defer db.Close()
 7    vars := mux.Vars(r)
 8    name := vars["name"]
 9    var user User
10    db.Where("name = ?", name).Find(&user)
11    db.Delete(&user)
12    fmt.Fprintf(w, "Successfully Deleted User")
13}

5、更新用户数据

其会先使用db.Where 方法,按相应的条件查询到对应的数据,并对其对应的email值进行重新赋值,并通过db.Save()进行数据库的更新,这点和上面删除用户是基本类似的。代码如下:

 1func updateUser(w http.ResponseWriter, r *http.Request) {
 2    db, err := gorm.Open("sqlite3", "test.db")
 3    if err != nil {
 4        panic("failed to connect database")
 5    }
 6    defer db.Close()
 7    vars := mux.Vars(r)
 8    name := vars["name"]
 9    email := vars["email"]
10    var user User
11    db.Where("name = ?", name).Find(&user)
12    user.Email = email
13    db.Save(&user)
14    fmt.Fprintf(w, "Successfully Updated User")
15}

参考页面:http://doc.gorm.io