本文共 3278 字,大约阅读时间需要 10 分钟。
这是系列文章的第三篇。下面是另外两篇的链接:
基本的 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 OKContent-Type: application/json; charset=utf-8Date: Sat, 03 Dec 2016 00:40:57 GMTContent-Length: 67{"id":2,"firstname":"Elvis","lastname":"Presley","city":"Memphis"}
这都是靠 main 函数这行代码中的这行代码来处理的:db.AutoMigrate(&Person{})
。在生产环境中,我们肯定要做其他更为精细的处理,不过作为原型验证,这已经足够了。
我知道你在想什么,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.DBvar err errortype 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 是一种既灵活又健壮的语言,它能简单又快捷的搭建出功能丰富的应用,而且还不需要很大的代码量。希望这篇文章能对你有点用处,欢迎在留言区写下你的想法和问题。
转载地址:http://wclzl.baihongyu.com/