golang gorm处理SQL数据

2019年3月18日 发表评论 阅读评论

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

go get -u github.com/jinzhu/gorm

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

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

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

二、数据库操作

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

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

1、初始化数据库

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

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

2、查询所有用户

创建一个allUsers()方法,其会连接数据库的相关表,使用db.Find(&users)方法返回所有的数据,再使用json模板,以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)
}

3、新增用户

创建newUser()方法,增加一个新增用户的方法,使用的db方法为: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")
}

4、删除用户

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

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

5、更新用户数据

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

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

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




本站的发展离不开您的资助,金额随意,欢迎来赏!

You can donate through PayPal.
My paypal id: itybku@139.com
Paypal page: https://www.paypal.me/361way

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.