说明
1、目的是练习golang基于gin+gorm的web开发涉及到的最基本的增删改查,所以关于数据库连接和对应配置从配置文件的读取没有详细说明
如果想了解配置文件解析和读取可以参考: Golang加载yaml类型配置文件问题
2、为了方便演示,所有的代码都在同一个文件todo.go
中,没有做项目目录的划分,关于项目目录划分后续文章介绍
3、为了保证http handle 逻辑和 实际model的正删改查不混在一起,所以这里定义了 service和handler
service 是 model的正删改查逻辑
handler 是 http 请求结构的逻辑
项目实战
model 定义
// todo model
type Todo struct {
gorm.Model
Title string `gorm:"type:varchar(200)"`
Status uint `gorm:"type:tinyint"`
}
// 数据库表明自定义,默认为model的复数形式,比如这里默认为 todos
func (Todo) TableName() string {
return "gocrud_todo"
}
数据库连接
// mysql connection
func ConnectDB() {
db, err = gorm.Open("mysql", "bamboo:Bamboo@tcp(127.0.0.1:3306)/bamboo?charset=utf8mb4&parseTime=True&loc=Local")
if err != nil {
log.Panicln("连接数据库报错" + err.Error())
}
// 最大空闲数
db.DB().SetMaxIdleConns(10)
// 最大连接数
db.DB().SetMaxOpenConns(50)
// 最长连接时间
db.DB().SetConnMaxLifetime(5 * time.Minute)
// open log
db.LogMode(true)
}
func DisconnectDB() {
if err = db.Close(); err != nil {
log.Println("数据库关闭失败:" + err.Error())
}
}
service定义
service 是 model的对于数据库的正删改查逻辑
func AddTodoService(todo *Todo) error {}
func UpdateTodoService(todo *Todo, id uint) error {}
func DeleteTodoService(id int) error {}
func GetTodoService(id int) (*Todo, error) {}
func ListTodoService()([]*Todo, error) {}
handler 定义
handler 是 http 请求API定义的逻辑
type TodoHttpAddHandler struct {
Title string `json:"title"`
}
func addTodoHandler(c *gin.Context) {}
func getTodoHandler(c *gin.Context) {}
type TodoHttpUpdateHandler struct {
Title string `json:"title"`
Status uint `json:"status"`
}
func updateTodoHandler(c *gin.Context) {}
func deleteTodoHandler(c *gin.Context) {}
func listTodoHandler(c *gin.Context) {}
路由定义
// router
func MapRouter() *gin.Engine {
router := gin.Default()
router.GET("/", indexHandler)
router.GET("/todo/", listTodoHandler)
router.POST("/todo/", addTodoHandler)
router.PUT("/todo/:id", updateTodoHandler)
// router.PATCH("/todo/:id", updateTodoHandler)
router.DELETE("/todo/:id", deleteTodoHandler)
router.GET("/todo/:id", getTodoHandler)
return router
}
主入口定义
注意这里的数据库连接和数据库关闭,采用defer
在程序结束之时执行数据库关闭操作
// main enterance
func main() {
ConnectDB()
defer DisconnectDB()
db.AutoMigrate(&Todo{})
router := MapRouter()
router.Run()
}
参考文档
mysql orm: https://gorm.io/docs/delete.html
go get -u github.com/jinzhu/gorm
web应用gin: https://github.com/gin-gonic/gin
go get -u github.com/gin-gonic/gin
完整的代码请参考 https://gitee.com/colin5063/go-learn/tree/master/20201223-crud,如需交流请入群 950828714
有疑问加站长微信联系(非本文作者)