go+gorm+mysql

  1. 使用gin
  2. 新建gorm
  3. 编写配置文件
  4. 启动gin框架

项目地址

gitee项目地址
https://gitee.com/heibaizi2000/todo.git

项目目录层次

config   配置文件
	- config.go
	- config.yaml
controller	接口地址
	- foodcontroller.go 
database 数据库实体类
	-db.go 初始化数据库
model 表的实体类
route  		编写路由
	-router.go 
main.go

config下的config.go文件

package config

import (
	"fmt"
	"github.com/spf13/viper"
)

//export config
type Config struct {
	Dsn           string
	SecretKey     string
	RedisHost     string
	RedisPassword string
	RedisDB       int
}

var Cfg *Config

// Init
func Init() {
	//file location
	viper.SetConfigFile("config/config.yaml")

	//if can't read it
	if err := viper.ReadInConfig(); err != nil {
		panic(fmt.Errorf("failed to read config %ss", err))
	}

	host := viper.GetString("mysql.host")
	port := viper.GetString("mysql.port")
	username := viper.GetString("mysql.username")
	password := viper.GetString("mysql.password")
	dbName := viper.GetString("mysql.db_name")

	redishost := viper.GetString("redis.Addr")
	redisPassword := viper.GetString("redis.Password")
	redisDB := viper.GetInt("redis.DB")

	dsn := username + ":" + password + "@tcp(" + host + ":" + port + ")/" + dbName + "?charset=utf8mb4&parseTime=True&loc=Local"
	Cfg = &Config{
		Dsn:           dsn,
		SecretKey:     viper.GetString("SecretKey"),
		RedisHost:     redishost,
		RedisPassword: redisPassword,
		RedisDB:       redisDB,
	}
}

config.yaml
mysql:
  host: localhost
  port: 3306
  username: food
  password: linyu0512
  db_name: food

redis:
  Addr: localhost
  Password: 123456
  DB: 0

SecretKey: "abcd1234"

controller

foodcontroller.go文件
package controller

import (
	"context"
	"github.com/gin-gonic/gin"
	"github.com/go-redis/redis/v8"
	_ "github.com/go-redis/redis/v8"
	"gorm.io/gorm"
	"log"
	"net/http"
	"order/model"
)

type Handlers struct {
	DB    *gorm.DB
	REDIS *redis.Client
}

var ctx = context.Background()

func (h *Handlers) GetTodos(c *gin.Context) {
	//先到redis中查询有无category
	result, err := h.REDIS.Get(ctx, "category").Result()
	if err != nil {
		//如果找到了 就从redis返回
		log.Println("redis没有")
	} else {
		c.JSON(http.StatusOK, result)
		//var foods []model.Food
		//h.DB.Where("category = ?", "酒").Find(&foods)
		//set := h.REDIS.LPush(ctx, "category", foods)
		//if set != nil {
		//	log.Println("可以")
		//}
	}
	//没有到数据库中查询
	//然后存到redis中

	var foods []model.Food
	//查询userid有多少待办事项
	//h.DB.Where("category = ?", c.GetString("category")).Find(&foods)
	h.DB.Where("category = ?", "酒").Find(&foods)
	//
	set := h.REDIS.Set(ctx, "category", 122, 0)

	if set != nil {
		log.Println("出错了")
	}
	c.JSON(http.StatusOK, foods)

}



func (h *Handlers) GetHello(c *gin.Context) {
	//var foods []model.Food
	查询userid有多少待办事项
	h.DB.Where("category = ?", c.GetString("category")).Find(&foods)
	//h.DB.Where("category = ?", "酒").Find(&foods)
	c.JSON(http.StatusOK, "foods")

}

database 下的db.go

package database

import (
	"github.com/go-redis/redis"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/schema"
	"order/config"
)

// 初始化mysql
func InitMysql() (*gorm.DB, error) {
	config.Init()

	db, err := gorm.Open(mysql.Open(config.Cfg.Dsn), &gorm.Config{
		// table add s
		NamingStrategy: schema.NamingStrategy{SingularTable: true},
	})

	if err != nil {
		panic("fail connect")
	}
	//建表
	//err = db.AutoMigrate(&model.User{}, &model.Todo{})
	//if err != nil {
	//	return nil, err
	//}

	return db, nil
}

// init redis
func InitRedis() (rdb *redis.Client, err error) {
	rdb = redis.NewClient(&redis.Options{
		Addr:     config.Cfg.RedisHost,
		Password: config.Cfg.RedisPassword, // no password set
		DB:       config.Cfg.RedisDB,       // use default DB
	})

	_, err = rdb.Ping().Result()
	if err != nil {
		return nil, err
	}
	return rdb, nil
}

redisHelp.go

package database

import (
	"github.com/go-redis/redis/v8"
	"sync"
	"time"
)

type RedisHelper struct {
	*redis.Client
}

var redisHelper *RedisHelper

var redisOnce sync.Once

func GetRedisHelper() *RedisHelper {
	return redisHelper
}

func NewRedisHelper() *redis.Client {
	rdb := redis.NewClient(&redis.Options{
		Addr:         "162.14.107.118:6379",
		Password:     "heibaizi2000+-*2023",
		DB:           0,
		DialTimeout:  10 * time.Second,
		ReadTimeout:  30 * time.Second,
		WriteTimeout: 30 * time.Second,
		PoolSize:     10,
		PoolTimeout:  30 * time.Second,
	})

	redisOnce.Do(func() {
		rdh := new(RedisHelper)
		rdh.Client = rdb
		redisHelper = rdh
	})

	return rdb
}

model实体类中间层

package model

type Food struct {
	ID       int    `json:"id" gorm:"primaryKey"`
	Category string `json:"category"`
	Name     string `json:"name"`
	Price    int    `json:"price"`
	image    int    `json:"image"`
}

router目录下的路由文件

package routes

import (
	"context"
	"github.com/gin-gonic/gin"
	"log"
	"order/controller"
	"order/database"
)

type Server interface {
	Run(addr ...string) (err error)
}

func setupRouter() *gin.Engine {
	//link mysql
	db, err := database.InitMysql()
	if err != nil {
		log.Println(err)
	}
	var (
		ctx = context.Background()
	)
	redisHelper := database.NewRedisHelper()
	if _, err := redisHelper.Ping(ctx).Result(); err != nil {
		log.Fatal(err.Error())
		return nil
	}

	h := controller.Handlers{DB: db, REDIS: redisHelper}
	r := gin.Default()
	r.GET("/todos", h.GetTodos)
	return r
}
func NewServer() Server {
	return setupRouter()
}

main.go 启动文件

package main

import "order/routes"

func main() {
	server := routes.NewServer()
	server.Run()
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值