使用Go,Gin和Gorm开发简单的CRUD API
介绍
Golang是一种令人兴奋的语言,但新手可能会被新的语法和各种框架所淹没。基础知识入门可能会成为一项挑战。
在这个例子中,我想展示创建功能API所需的最少代码。我们将开发一个简单的API,为基本模型提供创建,读取,更新和删除(CRUD)功能。使用和对象关系映射(ORM)工具,我们将能够快速更新我们的数据模型,所有数据模型都在100行代码之下。所以让我们开始吧。
在这里可以找到这篇文章的所有代码。
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"
)
//全局db connection
var db *gorm.DB
var err error
//person entity
type Person struct {
ID uint `json:"id"`
FirstName string `json:"first_name"`
LastName string `json:"last_name"`
City string `json:"city"`
}
func main() {
//使用sqlite3
db, err = gorm.Open("sqlite3", "./gorm.db")
//使用MySQL
//db, err = gorm.Open("mysql", "user:pass@tcp(127.0.0.1:3306)/database?charset=utf8&parseTime=True&loc=Local")
//自动迁移
db.AutoMigrate(&Person{})
//创建一些初始对象
//p1 := Person{FirstName: "John", LastName: "Doe"}
//p2 := Person{FirstName: "Jane", LastName: "Smith"}
//
//db.Create(&p1)
//db.Create(&p2)
//
//var p3 Person
//db.First(&p3)
//
//fmt.Println(&p3)
if err != nil {
fmt.Print(err.Error())
}
//延迟关闭
defer db.Close()
r := gin.Default()
r.GET("/people/", GetPeople)
r.GET("/people/:id", GetPerson)
r.POST("/people", CreatePeople)
r.PUT("/people/:id", UpdatePerson)
r.DELETE("/people/:id", DeletePerson)
//监听0.0.0.0:8080端口
r.Run(":8080")
}
func DeletePerson(c *gin.Context) {
id := c.Params.ByName("id")
var person Person
//根据ID查询之后删除
d := db.Where("id=?", id).Delete(&person)
fmt.Print(d)
c.JSON(200, gin.H{"id #" + id: "deleted"})
}
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.Error())
}
//使用bindJSON update字段
c.BindJSON(&person)
//提交更改
db.Save(&person)
c.JSON(200, &person)
}
func GetPeople(c *gin.Context) {
var persons []Person
//使用find查询
if error := db.Find(&persons).Error; err != nil {
c.AbortWithStatus(404)
fmt.Print(error.Error())
} else {
c.JSON(200, &persons)
}
}
func GetPerson(c *gin.Context) {
id := c.Params.ByName("id")
var person Person
//使用id查询指定条目
if err := db.Where("id=?", id).First(&person).Error; err != nil {
c.AbortWithStatus(404)
fmt.Println(err.Error())
} else {
c.JSON(200, &person)
}
}
func CreatePeople (c *gin.Context) {
var person Person
//使用bind JSON填充对象
c.BindJSON(&person)
//创建对象
db.Create(&person)
c.JSON(200, &person)
}
结论
Go是一个灵活的语言,具有强大的环境。它非常容易使用少量代码快速构建功能丰富的应用程序。我希望这是一个有用的练习。请随时分享您的想法和问题。