• 如何使用 Gin 和 Gorm 搭建一个简单的 API 服务 (三)


    修改数据结构

      基本的 API 已经定义好了,现在是个修改 Person 对象结构的好时机。只要修改 Person 结构体,数据库和 API 都会自动做出相应的修改。
      我要做的是在 Person 结构体中添加 city 字段,就这一行,没有其他改动。

    type Person struct {
            ID        uint   `json:"id"`
            FirstName string `json:"firstname"`
            LastName  string `json:"lastname"`
            City      string `json:"city"`
    }
    

      刷新浏览器,你就会看到 city 字段已经添加进去了。

    [{"id": 2,"firstname": "Elvis","lastname": "Presley","city": ""},{"id": 3,"firstname": "Tom","lastname": "Sawyer","city": ""}]
    

      Gin 可以创建和修改字段,而不需要做其他任何改动。

    $ 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 函数这行代码中的这行代码来处理的:db.AutoMigrate(&Person{})。在生产环境中,我们肯定要做其他更为精细的处理,不过作为原型验证,这已经足够了。

    使用 MySQL

      我知道你在想什么,Gin 确实很棒,但为什么不用 MySQL 替换 SQLite 呢。
      只需要替换一下 import 声明和数据库连接就行了。

      import 声明代码:

    import _ “github.com/go-sql-driver/mysql”
    

      数据库连接代码:

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

    总结

      Go 是一种既灵活又健壮的语言,它能简单又快捷的搭建出功能丰富的应用,而且还不需要很大的代码量。希望这篇文章能对你有点用处,欢迎在留言区写下你的想法和问题。



    作者:blackpiglet
    链接:https://www.jianshu.com/p/b34c3f17b417
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    201202
    Android牟利之道(一)界面嵌入有米广告
    SoketException log
    ERROR: 9patch image about.9.png malformed.
    Conversion to Dalvik format failed with error 1
    absolute绝对定位(相对于整个html流)以及不为人知的(fixed)绝对定位(fixed相对于浏览器窗口=不动的div)
    about getElementsByTagName()的那点事
    js 不用onload的loding
    absolute fixed效果 复制网页打开就是代码 http://www.cnblogs.com/0banana0/archive/2011/05/25/2056643.html
    关于datetime的那点事
  • 原文地址:https://www.cnblogs.com/php-linux/p/13074169.html
Copyright © 2020-2023  润新知