如何使用 Gin 和 Gorm 搭建一個簡單的 API 服務(wù) (三)

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ū)寫下你的想法和問題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蒂教,一起剝皮案震驚了整個濱河市巍举,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凝垛,老刑警劉巖懊悯,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異梦皮,居然都是意外死亡定枷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門届氢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來欠窒,“玉大人,你說我怎么就攤上這事退子♂” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵寂祥,是天一觀的道長荐虐。 經(jīng)常有香客問我,道長丸凭,這世上最難降的妖魔是什么福扬? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮惜犀,結(jié)果婚禮上铛碑,老公的妹妹穿的比我還像新娘。我一直安慰自己虽界,他們只是感情好汽烦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著莉御,像睡著了一般撇吞。 火紅的嫁衣襯著肌膚如雪俗冻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天牍颈,我揣著相機(jī)與錄音迄薄,去河邊找鬼。 笑死煮岁,一個胖子當(dāng)著我的面吹牛噪奄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播人乓,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼勤篮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了色罚?” 一聲冷哼從身側(cè)響起碰缔,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎戳护,沒想到半個月后金抡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腌且,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年梗肝,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铺董。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡巫击,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出精续,到底是詐尸還是另有隱情坝锰,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布重付,位于F島的核電站顷级,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏确垫。R本人自食惡果不足惜弓颈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望删掀。 院中可真熱鬧翔冀,春花似錦、人聲如沸爬迟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽付呕。三九已至计福,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間徽职,已是汗流浹背象颖。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留姆钉,地道東北人说订。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像潮瓶,于是被迫代替她去往敵國和親陶冷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容