https://www.pixiv.net/artworks/69529711

使用Go,Gin和Gorm开发简单的CRUD API

Golang Oct 14, 2018

介绍

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是一个灵活的语言,具有强大的环境。它非常容易使用少量代码快速构建功能丰富的应用程序。我希望这是一个有用的练习。请随时分享您的想法和问题。

Tags

壳壳

一个想法不一定对