新學golang,嘔心瀝血小幾天,轉載請務必附上本文連接。
可能有些地方寫的不是很好,請在評論區指教一二~
package main import ( "fmt"
"github.com/gin-gonic/gin" _ "github.com/go-sql-driver/mysql"
"github.com/jinzhu/gorm"
"github.com/sirupsen/logrus"
"net/http"
"os"
"strconv"
"time" ) //對應的實體類
type AppConf struct { Id int `gorm:"type:bigint(20);column:id;primary_key;AUTO_INCREMENT"` App_Id int `gorm:"type:bigint(20);column:app_id;not null"` Key string `gorm:"type:varchar(255);column:key;not null"` Content string `gorm:"type:varchar(1500);column:content;not null"` Ctime int `gorm:"type:bigint(20);column:ctime;not null"` Utime int `gorm:"type:bigint(20);column:utime;not null"` } //聲明全局數據庫連接變量
var db *gorm.DB var log = logrus.New() func main() { defer db.Close() engine := gin.Default() engine.Use(LoggerToFile()) routerGroup := engine.Group("/test") //查詢所有數據
routerGroup.GET("/appConfs", ListAll) //增加數據
routerGroup.POST("/appConfs", Add) //刪除數據
routerGroup.DELETE("/appConfs/:id", Delete) //更新數據
routerGroup.PATCH("/appConfs/:id", Update) engine.Run(":9999") } //初始化,創建連接
func init() { //連接mysql
db, _ = gorm.Open("mysql", "root:123456(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local") LoggerToFile() //單對單
db.SingularTable(true) //設置數據庫連接池
db.DB().SetMaxIdleConns(5) db.DB().SetMaxOpenConns(10) } //查詢所有用戶信息
func ListAll(context *gin.Context) { var ( //定義數據表條數
count int
//為count傳參
appConfCount[] AppConf ) //獲取指定表的數據總條數
err := db.Model(&appConfCount).Count(&count) if err != nil { context.JSON(http.StatusOK,gin.H{ "code":401, "status":"error", "message":"空表 !", "data":"null", }) } //創建一個長度為0,容量為count的切片,使其避免擴容。 當時沒用gorm,需要存到集合里,才會有擴容。下述不會
var appConfs = make([]AppConf, 0, count) //查詢數據表 app_conf
rowsAffected:= db.Model(&AppConf{}).Find(&appConfs).RowsAffected if rowsAffected > 0 { context.JSON(http.StatusOK,gin.H{ "code":200, "status":"success", "data":appConfs, }) }else { context.JSON(http.StatusOK,gin.H{ "code":401, "status":"error", "message":"空表 !", "data":"null", }) } } //新增數據
func Add(context *gin.Context) { var appConf AppConf //綁定結構體
context.Bind(&appConf) fmt.Println(appConf) //若id一樣,則添加失敗
rowsAffected := db.Model(&AppConf{}).Create(&appConf).RowsAffected if rowsAffected > 0 { context.JSON(http.StatusOK,gin.H{ "code":200, "status":"success", "message":"添加成功 !", }) }else { context.JSON(http.StatusOK, gin.H{ "code":401, "status":"error", "message": "添加失敗", }) } } //根據id刪除數據
func Delete(context *gin.Context) { id := context.Param("id") //sting裝int
s,_ := strconv.Atoi(id) rowsAffected := db.Model(&AppConf{}).Where(&AppConf{Id: s}).Delete(&AppConf{}).RowsAffected //fmt.Println(rowsAffected)
if rowsAffected > 0 { context.JSON(http.StatusOK,gin.H{ "code":200, "status":"success", "message":"刪除成功", }) } else { context.JSON(http.StatusOK,gin.H{ "code":401, "status":"error", "message":"刪除失敗", }) } } //根據id修改信息
func Update(context *gin.Context) { var appConf AppConf id := context.Param("id") s,_ := strconv.Atoi(id) //綁定結構體
context.Bind(&appConf) rowsAffected := db.Model(&AppConf{}).Where(&AppConf{Id: s}).Update(&appConf).RowsAffected if rowsAffected > 0 { context.JSON(http.StatusOK,gin.H{ "code":200, "status":"success", "message":"更新成功", }) } else { context.JSON(http.StatusOK,gin.H{ "code":401, "status":"error", "message":"更新失敗", }) } } func LoggerToFile() gin.HandlerFunc { fileName := "./logger.log"
//寫入文件
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:"2006-01-01 15:04:05", }) //設置日志格式
logger.SetFormatter(&logrus.JSONFormatter{}) return func(c *gin.Context) { // 開始時間
startTime := time.Now() // 處理請求
c.Next() // 結束時間
endTime := time.Now() // 執行時間
latencyTime := endTime.Sub(startTime) latencyTime2 := float32(latencyTime) / float32(1000000) // 請求方式
reqMethod := c.Request.Method // 請求路由
reqUri := c.Request.RequestURI // 狀態碼
statusCode := c.Writer.Status() // 請求IP
clientIP := c.Request.Host // 日志格式
logger.WithFields(logrus.Fields{ "status_code" : statusCode, "latency_time" : latencyTime2, "client_ip" : clientIP, "req_method" : reqMethod, "req_uri" : reqUri, }).Info() } }