如何使用|如何使用 Gin 和 Gorm 搭建一个简单的 API 服务 (三)
文章图片
gin-gonic ??这是系列文章的第三篇。下面是另外两篇的链接:
??如何使用 Gin 和 Gorm 搭建一个简单的 API 服务(一)
??如何使用 Gin 和 Gorm 搭建一个简单的 API 服务(二)
修改数据结构
??基本的 API 已经定义好了,现在是个修改 Person 对象结构的好时机。只要修改 Person 结构体,数据库和 API 都会自动做出相应的修改。
??我要做的是在 Person 结构体中添加 city 字段,就这一行,没有其他改动。
type Person struct {
IDuint`json:"id"`
FirstName string `json:"firstname"`
LastNamestring `json:"lastname"`
Citystring `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 mainimport (
"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 errortype Person struct {
IDuint`json:"id"`
FirstName string `json:"firstname"`
LastNamestring `json:"lastname"`
Citystring `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"})
}
总结 【如何使用|如何使用 Gin 和 Gorm 搭建一个简单的 API 服务 (三)】??Go 是一种既灵活又健壮的语言,它能简单又快捷的搭建出功能丰富的应用,而且还不需要很大的代码量。希望这篇文章能对你有点用处,欢迎在留言区写下你的想法和问题。
推荐阅读
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- 由浅入深理解AOP
- 如何寻找情感问答App的分析切入点
- 【译】20个更有效地使用谷歌搜索的技巧
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- 基于|基于 antd 风格的 element-table + pagination 的二次封装
- python自定义封装带颜色的logging模块
- 如何在Mac中的文件选择框中打开系统隐藏文件夹