前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何使用 Gin 和 Gorm 搭建一个简单的 API 服务 (三)

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

作者头像
用户2443625
发布2018-08-23 11:46:52
6730
发布2018-08-23 11:46:52
举报
文章被收录于专栏:blackpigletblackpiglet

gin-gonic

  这是系列文章的第三篇。下面是另外两篇的链接:

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

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

修改数据结构

  基本的 API 已经定义好了,现在是个修改 Person 对象结构的好时机。只要修改 Person 结构体,数据库和 API 都会自动做出相应的修改。

  我要做的是在 Person 结构体中添加 city 字段,就这一行,没有其他改动。

代码语言:javascript
复制
type Person struct {
        ID        uint   `json:"id"`
        FirstName string `json:"firstname"`
        LastName  string `json:"lastname"`
        City      string `json:"city"`
}

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

代码语言:javascript
复制
[{"id": 2,"firstname": "Elvis","lastname": "Presley","city": ""},{"id": 3,"firstname": "Tom","lastname": "Sawyer","city": ""}]

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

代码语言:javascript
复制
$ 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 声明代码:

代码语言:javascript
复制
import _ “github.com/go-sql-driver/mysql”

  数据库连接代码:

代码语言:javascript
复制
db, _ = gorm.Open("mysql", "user:pass@tcp(127.0.0.1:3306)/database?charset=utf8&parseTime=True&loc=Local")

  完整代码:

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.03.15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 修改数据结构
  • 使用 MySQL
  • 总结
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档