golang gorm处理SQL数据
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
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/gorm-sql/6061.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.