gin-gonic
??這是系列文章的第三篇绍撞。下面是另外兩篇的鏈接:
??如何使用 Gin 和 Gorm 搭建一個簡單的 API 服務(wù)(一)
??如何使用 Gin 和 Gorm 搭建一個簡單的 API 服務(wù)(二)
修改數(shù)據(jù)結(jié)構(gòu)
??基本的 API 已經(jīng)定義好了,現(xiàn)在是個修改 Person 對象結(jié)構(gòu)的好時機(jī)得院。只要修改 Person 結(jié)構(gòu)體傻铣,數(shù)據(jù)庫和 API 都會自動做出相應(yīng)的修改。
??我要做的是在 Person 結(jié)構(gòu)體中添加 city 字段尿招,就這一行矾柜,沒有其他改動阱驾。
type Person struct {
ID uint `json:"id"`
FirstName string `json:"firstname"`
LastName string `json:"lastname"`
City string `json:"city"`
}
??刷新瀏覽器就谜,你就會看到 city 字段已經(jīng)添加進(jìn)去了。
[{"id": 2,"firstname": "Elvis","lastname": "Presley","city": ""},{"id": 3,"firstname": "Tom","lastname": "Sawyer","city": ""}]
??Gin 可以創(chuàng)建和修改字段里覆,而不需要做其他任何改動丧荐。
$ curl -i -X PUT http://localhost:8080/people/2 -d '{ "city": "Memphis" }'
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Date: Sat, 03 Dec 2016 00:40:57 GMT
Content-Length: 67
{"id":2,"firstname":"Elvis","lastname":"Presley","city":"Memphis"}
??這都是靠 main 函數(shù)這行代碼中的這行代碼來處理的:db.AutoMigrate(&Person{})
。在生產(chǎn)環(huán)境中喧枷,我們肯定要做其他更為精細(xì)的處理虹统,不過作為原型驗證弓坞,這已經(jīng)足夠了。
使用 MySQL
??我知道你在想什么车荔,Gin 確實很棒渡冻,但為什么不用 MySQL 替換 SQLite 呢。
??只需要替換一下 import 聲明和數(shù)據(jù)庫連接就行了忧便。
??import 聲明代碼:
import _ “github.com/go-sql-driver/mysql”
??數(shù)據(jù)庫連接代碼:
db, _ = gorm.Open("mysql", "user:pass@tcp(127.0.0.1:3306)/database?charset=utf8&parseTime=True&loc=Local")
??完整代碼:
package main
import (
"fmt"
"github.com/gin-gonic/gin"
_ "github.com/go-sql-driver/mysql"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/sqlite"
)
var db *gorm.DB
var err error
type Person struct {
ID uint `json:"id"`
FirstName string `json:"firstname"`
LastName string `json:"lastname"`
City string `json:"city"`
}
func main() {
// NOTE: See we're using = to assign the global var
// instead of := which would assign it only in this function
// db, err = gorm.Open("sqlite3", "./gorm.db")
db, _ = gorm.Open("mysql", "user:pass@tcp(127.0.0.1:3306)/database?charset=utf8&parseTime=True&loc=Local")
if err != nil {
fmt.Println(err)
}
defer db.Close()
db.AutoMigrate(&Person{})
r := gin.Default()
r.GET("g/", GetProjects)
r.GET("/people/:id", GetPerson)
r.POST("/people", CreatePerson)
r.PUT("/people/:id", UpdatePerson)
r.DELETE("/people/:id", DeletePerson)
r.Run("g:8080")
}
func GetProjects(c *gin.Context) {
var people []Person
if err := db.Find(&people).Error; err != nil {
c.AbortWithStatus(404)
fmt.Println(err)
} else {
c.JSON(200, people)
}
}
func GetPerson(c *gin.Context) {
id := c.Params.ByName("id")
var person Person
if err := db.Where("id = ?", id).First(&person).Error; err != nil {
c.AbortWithStatus(404)
fmt.Println(err)
} else {
c.JSON(200, person)
}
}
func CreatePerson(c *gin.Context) {
var person Person
c.BindJSON(&person)
db.Create(&person)
c.JSON(200, person)
}
func UpdatePerson(c *gin.Context) {
var person Person
id := c.Params.ByName("id")
if err := db.Where("id = ?", id).First(&person).Error; err != nil {
c.AbortWithStatus(404)
fmt.Println(err)
}
c.BindJSON(&person)
db.Save(&person)
c.JSON(200, person)
}
func DeletePerson(c *gin.Context) {
id := c.Params.ByName("id")
var person Person
d := db.Where("id = ?", id).Delete(&person)
fmt.Println(d)
c.JSON(200, gin.H{"id #" + id: "deleted"})
}
總結(jié)
??Go 是一種既靈活又健壯的語言族吻,它能簡單又快捷的搭建出功能豐富的應(yīng)用,而且還不需要很大的代碼量珠增。希望這篇文章能對你有點(diǎn)用處超歌,歡迎在留言區(qū)寫下你的想法和問題。