gin整合ent
项目目录目录结构如下
EntDemo
- EntDemo
- app
- controller
- models
- service
- config
- db.ini
- mysql.go
- ent
- routers
- router.go
- router_group
- demo_router.go
- go.mod
- start.go(main.go)
- app
本文章主要描述封装的部分和controller直接调用
上代码,请注意项目目录结构
这是config的mysql.go的内容,封装了ent
package config
import (
"Ent_Demo/ent"
"context"
"fmt"
"github.com/go-ini/ini"
_ "github.com/go-sql-driver/mysql"
"log"
)
var (
Client *ent.Client
)
func init() {
cfg, err := ini.Load("config/db.ini")//读取ini需要用到github.com/go-ini/ini
if err != nil {
log.Fatalf("failed to load config file: %v", err)
}
//client := ent.Client{User: ent.NewUserClient()}
//client, err1 := ent.Open("mysql", "root:@(127.0.0.1:3306)/ent_demo?parseTime=True")
//if err1 != nil {
// log.Fatalf("failed opening connection to mysql: %v", err1)
//}
//defer client.Close()
key, _ := cfg.Section("db").GetKey("driver")
driver := key.Value()
key, _ = cfg.Section("db").GetKey("datasource")
datasource := key.Value()
Client, err = ent.Open(driver, datasource)//此处记得导入_ "github.com/go-sql-driver/mysql"
if err != nil {
log.Println("failed opening connection to database: %v", err)
}
fmt.Println("成功连接数据库")
//defer Client.Close()
ctx := context.Background()
if err := Client.Schema.Create(ctx); err != nil {
log.Fatalf("failed creating schema resources: %v", err)
}
}
controller中直接调用
package demo
import (
"Ent_Demo/config"
_ "Ent_Demo/ent"
"context"
"fmt"
"github.com/gin-gonic/gin"
"net/http"
"time"
)
func GetHelloWorld(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"status": 200,
"info": "Hello",
})
return
}
func GetUserList(c *gin.Context) {
//client := ent.Client{User: ent.NewUserClient()}
//client, err1 := ent.Open("mysql", "root:@(127.0.0.1:3306)/ent_demo?parseTime=True")
//if err1 != nil {
// log.Fatalf("failed opening connection to mysql: %v", err1)
//}
//defer client.Close()
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
users, err := config.Client.User.Query().All(ctx) // UserClient.
if err != nil {
fmt.Println(err)
}
c.JSON(http.StatusOK, gin.H{
"data": users,
})
return
}
在routers文件夹中封装好router
router.go
package routers
import (
"Ent_Demo/routers/router_group"
"github.com/gin-gonic/gin"
"net/http"
)
func InitBackGroundRouter() *gin.Engine {
router := gin.Default()
router.Use(Recover)
v1 := router.Group("/demo")
router_group.DemoRouter(v1)
return router
}
func Recover(c *gin.Context) {
defer func() {
if r := recover(); r != nil {
c.JSON(http.StatusOK, gin.H{
"status": 201,
"msg": "error",
"data": nil,
})
//终止后续接口调用,不加的话recover到异常后,还会继续执行接口里后续代码
c.Abort()
}
}()
//加载完 defer recover,继续后续接口调用
c.Next()
}
demo_router.go
package router_group
import (
"Ent_Demo/app/controller/demo"
"github.com/gin-gonic/gin"
)
func DemoRouter(v1 *gin.RouterGroup) {
v1.GET("/helloworld", demo.GetHelloWorld)
v1.GET("/userlist", demo.GetUserList)
}
ent文件夹的内容是自动生成的,请看ent-go官网
访问接口localhost:8100/demo/userlist