Gin框架学习(八)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
日志服务 SLS,月写入数据量 50GB 1个月
简介: 来这里学Gin框架,目标明确不迷茫。

学习思维导图

Gin框架思维导图

互动

临近五一尾声,大家五一一定收获满满,是快乐还是知识呢!
五一小长假我又加更了,如今==Gin框架学习==这块学习也要接近尾声了,感谢你们的支持!
近期或者过段时间出Beego框架学习教程欢迎来观看!

精通篇

日志记录

日志记录是将程序上运行的动作记录下来,比如什么时候谁做了什么事情

日志框架

package main
import (
    "github.com/gin-gonic/gin"
    "io"
    "os"
)

func Logger() *logrus.Logger {
    now := time.Now()
    logFilePath := ""
    if dir, err := os.Getwd(); err == nil {
        logFilePath = dir + "/logs/"
    }
    if err := os.MkdirAll(logFilePath, 0777); err != nil {
        fmt.Println(err.Error())
    }
    logFileName := now.Format("2021-05-04") + ".log"
    //日志文件
    fileName := path.Join(logFilePath, logFileName)
    if _, err := os.Stat(fileName); err != nil {
        if _, err := os.Create(fileName); err != nil {
            fmt.Println(err.Error())
        }
    }
    //写入文件
    src, err := os.OpenFile(fileName, os.O_APPEND|os.O_WRONLY, os.ModeAppend)
    if err != nil {
        fmt.Println("err", err)
    }
    //实例化
    logger := logrus.New()
    //设置输出
    logger.Out = src
    //设置日志级别
    logger.SetLevel(logrus.DebugLevel)
    //设置日志格式
    logger.SetFormatter(&logrus.TextFormatter{
        TimestampFormat: "2021-05-04 19:23:51",
    })
    return logger
}

func LoggerFile() gin.HandlerFunc {
    logger := Logger()
    return func(c *gin.Context) {
        // 开始时间
        startTime := time.Now()
        // 处理请求
        c.Next()
        // 结束时间
        endTime := time.Now()
        // 执行时间
        latencyTime := endTime.Sub(startTime)
        // 请求方式
        reqMethod := c.Request.Method
        // 请求路由
        reqUri := c.Request.RequestURI
        // 状态码
        statusCode := c.Writer.Status()
        // 请求IP
        clientIP := c.ClientIP()
        //日志格式
        logger.Infof("| %3d | %13v | %15s | %s | %s |",
            statusCode,latencyTime,clientIP,reqMethod,reqUri,
        )
    }
}

func main() {
    // 记录到文件。
    r := gin.Default()
    r.Use(LoggerFile())
    r.GET("/", func(context *gin.Context) {
        //Info级别的日志
        Logger().WithFields(logrus.Fields{
            "name": "hanyun",
        }).Info("记录一下日志", "Info")
        //Error级别的日志
        Logger().WithFields(logrus.Fields{
            "name": "hanyun",
        }).Error("记录一下日志", "Error")
        //Warn级别的日志
        Logger().WithFields(logrus.Fields{
            "name": "hanyun",
        }).Warn("记录一下日志", "Warn")
        //Debug级别的日志
        Logger().WithFields(logrus.Fields{
            "name": "hanyun",
        }).Debug("记录一下日志", "Debug")
    })
    r.Run()
}

数据库

sql包:go get -u github.com/go-sql-driver/mysql

原生数据库

package main
import (
    "database/sql"
    "fmt"
    //_空导入指定包
    _ "github.com/go-sql-driver/mysql"
)
var SqlDb *sql.DB
func init() {
    // 连接数据库:root --> (数据库用户名),123456 --> (数据库密码),tcp@(127.0.0.1) --> (本地地址),mysql --> (数据库库名)
    sqladdrs := "root:123456@tcp(127.0.0.1)/mysql?charset=utf8&parseTime=true&loc=Local"
    var err error
    SqlDb, err = sql.Open("mysql", sqladdrs)
    //测试数据库是否打开成功
    if err != nil {
        fmt.Println("数据库打开出现了问题", err)
        return
    }
    // 测试数据库是否连接成功
    err = SqlDb.Ping()
    if err != nil {
        fmt.Println("数据库连接出现了问题", err)
        return
    }
}
//Sql数据
type SqlUser struct {
    Name    string `json:"name"`
    Age     int    `json:"age"`
}
func InsertData(c *gin.Context) {
    var u SqlUser
    err := c.Bind(&u)
    sql := "insert into user(name, age) values (?,?)"
    ret, err := sqlDb.Exec(sql, u.Name, u.Age)
    if err != nil {
        fmt.Printf("插入失败:%v\n", err)
        return false
    } else {
        return true
}
func main() {
    r:= gin.Default()
    r.POST("/", InsertData)
    r.Run()
}

XORM数据库

package main
import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
)
var x *xorm.Engine
var xormResponse XormResponse

type SqlUser struct {
    Name    string `json:"name"`
    Age     int    `json:"age"`
}
func init() {
    sqladdrs:= "root:123456@tcp(127.0.0.1)/xorm?charset=utf8&parseTime=true&loc=Local" 
    var err error
    x, err = xorm.NewEngine("mysql", sqladdrs) 
    if err != nil {
        fmt.Println("数据库连接失败:", err)
    }
    err = x.Sync(new(Stu))
    if err != nil {
        fmt.Println("数据表同步失败:", err)
    }
}
func main() {
    r:= gin.Default()
    r.POST("/", InsertData)
    r.Run()
}
func InsetData(c *gin.Context) {
    var s Stu
    err := c.Bind(&s)
    if err != nil {
        fmt.Println("参数错误", err) 
        return
    }
    aff, err := x.Insert(s)
    if err != nil || aff <= 0 {
        fmt.Println("插入失败", err)
        return false
    } else {
        return true
}

GORM数据库

package main
import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
)
var gormDB *gorm.DB
var gormResponse GormResponse

type SqlUser struct {
    Name    string `json:"name"`
    Age     int    `json:"age"`
}
func init() {
    var err error
    sqlStr := "root:123456@tcp(127.0.0.1)/gorm?charset=utf8mb4&parseTime=true&loc=Local"
    gormDB, err = gorm.Open(mysql.Open(sqlStr), &gorm.Config{}) //配置项中预设了连接池 ConnPool
    if err != nil {
        fmt.Println("数据库连接出现了问题:", err)
        return
    }
}
func main() {
    r := gin.Default()
    r.POST("/", InsertData)
}
func InsertData(c *gin.Context) {
    defer func() {
        err := recover()
        if err != nil {
            fmt.Println("捕获异常", err) 
        }
    }()
    var p Product
    err := c.Bind(&p)
    if err != nil {
           fmt.Println("参数错误", err) 
        return
    }
    fmt.Println(p)
    tx := gormDB.Create(&p)
    if tx.RowsAffected > 0 {
           fmt.Println("插入失败", err)
        return false
    } else {
        return true
}

后记

喜欢的话可以三连,后续继续更新其他内容,帮忙推一推,感谢观看!

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
11月前
|
Go API 网络架构
Gin框架快速入门1
Gin框架快速入门1
107 0
|
SQL 关系型数据库 MySQL
gin框架学习-Gorm入门指南
Snake Case命名风格,就是各个单词之间用下划线(_)分隔,首字母大写区分一个单词,例如: CreateTime的Snake Case风格命名为create_time
414 0
gin框架学习-Gorm入门指南
|
4月前
|
Go
gin初体验
gin初体验
|
4月前
|
JSON 中间件 API
Gin框架笔记(一) Gin框架的安装与Hello World
Gin框架笔记(一) Gin框架的安装与Hello World
143 0
|
4月前
|
JSON 中间件 数据格式
Gin框架学习笔记(六)——gin中的日志使用
Gin框架学习笔记(六)——gin中的日志使用
148 0
|
4月前
|
前端开发 中间件 关系型数据库
|
4月前
|
JSON 前端开发 Java
|
Go API
gin框架学习-快速安装gin
Gin 是一个用 Go (Golang) 编写的 Web 框架,由于 httprouter,它具有 martini 的 API,性能提高了 40 倍。具有高性能的优点。
160 0
gin框架学习-快速安装gin
|
JSON 前端开发 关系型数据库
gin框架学习-Gin框架和Gorm框架搭建一个简单的API微服务
创建包管理工具,此命令会在当前目录中初始化和创建一个新的go.mod文件,手动创建go.mod文件再包含一些module声明也等同该命令,而go mod init命令便是帮我们简便操作,可以帮助我们自动创建。
603 0
gin框架学习-Gin框架和Gorm框架搭建一个简单的API微服务
|
开发工具
基于Gin封装Web框架 - 3. 初始化 rum 框架
基于Gin封装Web框架 - 3. 初始化 rum 框架
185 0
基于Gin封装Web框架 - 3. 初始化 rum 框架