Go gorm和go-redis使用

用的是go mod管理包
先go mod init 模块名,初始化生成go.mod文件
直接在包里引入需要的包名,在执行相关的go run或go build命令,会自动将你引入的包下载下来,并在go.mod和go.sum文件中记录相关的包信息
这里主要是使用了gorm包和go-redis包连接和操作mysql、redis数据库
gorm先是尝试了1.9.16版本的,批量插入和in查询都有点问题,后面下载使用1.20.9版本之后,都没什么问题了,1.20之后引入包名的路径变了,在使用gorm时,也要引入相关数据库的驱动包,我这里引入的是mysql的,在gorm包里面也包括了这个驱动包
贴测试的代码:

在使用gorm时,使用Table方法指定表名时,无法使用到gorm提供的软删除、关联查询等方法。查询时需通过gorm数据表结构体去查询,Find可以指定表结构体时直接使用Find,无法使用到表结构体时可以使用Model方法+Scan方法,Model和Find同时使用Find的结构体会覆盖前面Model指定的表结构体。在更新时使用Model指定表结构体,删除时Delete直接指定表结构体。

package main

import (
	"fmt"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	// "github.com/jinzhu/gorm"
	// _ "github.com/jinzhu/gorm/dialects/mysql"
)

type SmTest struct {
	Id   int
	Name string
	Age  int `gorm:"default:18"`
}

func (SmTest) TableName() string {
	return "sm_test"
}

func main() {
	//gorm1.9.16版本连接方式
	// db, err := gorm.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/sm_db?charset=utf8mb4&parseTime=True&loc=Local")
	// db.SingularTable(true)
	//gorm2版本连接方式
	db, err := gorm.Open(mysql.Open("root:123456@tcp(127.0.0.1:3306)/sm_db?charset=utf8mb4&parseTime=True&loc=Local"), &gorm.Config{})
	if err != nil {
		fmt.Println(err)
		return
	}
	// 单条插入
	test := SmTest{
		Name: "yzl",
		Age:  18,
	}
	res := db.Create(&test)       //添加数据
	fmt.Println(test.Id)          //添加数据的id
	fmt.Println(res.Error)        //添加时出现的错误,没有错误返回nil
	fmt.Println(res.RowsAffected) //插入记录的条数

	//多条插入
	// tests := []SmTest{
	// 	{Name: "yzl", Age: 20},
	// 	{Name: "yyy", Age: 21},
	// 	{Name: "zzz", Age: 22},
	// 	{Name: "lll", Age: 23},
	// }
	// res := db.Create(&tests)
	// for _, test := range tests {
	// 	fmt.Println(test.Id)
	// }
	// fmt.Println(res.Error)
	// fmt.Println(res.RowsAffected)

	//单条查询
	// test := SmTest{}
	// res := db.First(&test) //取出按id正序排的第一条
	// res := db.Take(&test) //取出不排序的第一条
	// res := db.Last(&test) //取出按id倒序排的第一条
	// fmt.Println(test)
	// fmt.Println(res.RowsAffected) //返回查到的记录数
	// fmt.Println(res.Error)        //返回错误

	//根据主键查询
	// test := SmTest{}
	// db.First(&test, 7) //查询主键为2的记录
	// fmt.Println(test)
	//根据主键多条查询
	// tests := []SmTest{}
	// db.Find(&tests, []int{1, 2, 7}) //查询主键为1,2,3的记录
	// fmt.Println(tests)

	// 查看全部记录
	// tests := []SmTest{}
	// res := db.Find(&tests)
	// fmt.Println(tests)
	// fmt.Println(res.RowsAffected)
	// fmt.Println(res.Error)

	//String条件查询
	// tests := []SmTest{}
	// res := db.Where("name=?", "yzl").Find(&tests) //根据name精确查询
	// res := db.Where("name like ?", "%y%").Find(&tests) //根据name模糊查询
	// res := db.Where("name in ?", []string{"yzl", "zzz"}).Find(&tests) //根据name in查询
	// res := db.Where("id in (?)", []int{1, 2}).Find(&tests) //根据id in查询
	// res := db.Select("id, name, age").Where("name = ? and age = ?", "yzl", 18).Limit(3).Offset(0).Order("id desc").Find(&tests)
	// fmt.Println(tests)
	// fmt.Println(res.RowsAffected)
	// fmt.Println(res.Error)

	// Struct结构体条件查询
	// test := SmTest{}
	// db.Where(&SmTest{Name: "yzl", Age: 18}).First(&test)
	// // SELECT * FROM sm_test WHERE name = "yzl" AND age = 18 ORDER BY id LIMIT 1;
	// fmt.Println(test)

	// Map条件查询
	// tests := []SmTest{}
	// db.Where(map[string]interface{}{"name": "yzl", "age": 18}).Find(&tests)
	// // SELECT * FROM sm_test WHERE name = "yzl" AND age = 18;
	// fmt.Println(tests)

	// 主键切片条件
	// tests := []SmTest{}
	// db.Where([]int64{3, 4, 7}).Find(&tests)
	// fmt.Println(tests)

	//单列更新
	// res := db.Model(&SmTest{}).Where("age = ?", 18).Update("name", "hello")
	// fmt.Println(res.RowsAffected)

	//多列更新
	// res := db.Model(&SmTest{}).Where("age = ?", 18).Updates(SmTest{Name: "test", Age: 23})
	// fmt.Println(res.RowsAffected)

	//删除
	// res := db.Delete(&SmTest{}, 7) //删除数据
	// fmt.Println(res.RowsAffected)

	//根据条件删除
	// res := db.Where("name = ?", "test").Delete(&SmTest{})
	// fmt.Println(res.RowsAffected)

	//gorm2版本以上不需要使用
	// defer db.Close()

}

把1.9版本和gorm.io/gorm1.20.9版本的代码都贴上去了

这里是有关go-redis包的操作示例,只是展示简单的操作方法,其实里面的方法名基本和redis的命令名差不多是一样的,参数情况直接看源码也就知道怎么用了,贴代码:

package main

import (
	"fmt"

	"github.com/go-redis/redis"
)

func main() {
	rdb := redis.NewClient(&redis.Options{
		Addr:     "127.0.0.1:6379", //连接地址
		Password: "",               //连接密码
		DB:       0,                //默认连接库
		PoolSize: 100,              //连接池大小
	})
	_, err := rdb.Ping().Result()
	if err != nil {
		fmt.Println("redis连接失败")
		return
	}

	//set,get示例
	err1 := rdb.Set("name", "yyy", 10000000000).Err() //10s
	if err1 != nil {
		fmt.Println("设置值错误")
		return
	}
	val, err1 := rdb.Get("name").Result()
	if err1 != nil {
		fmt.Println("获取值错误")
		return
	}
	fmt.Println(val)

	//hash hget/hset操作
	// err1 := rdb.HSet("id_1", "name", "yzl").Err()
	// if err1 != nil {
	// 	fmt.Println("设置哈希值错误")
	// 	return
	// }
	// val, err1 := rdb.HGet("id_1", "name").Result()
	// if err1 != nil {
	// 	fmt.Println("获取哈希值错误")
	// 	return
	// }
	// fmt.Println(val)

	//链表lpush/lrange操作
	// err1 := rdb.LPush("id_2", 1, 2, 3).Err()
	// if err1 != nil {
	// 	fmt.Println("设置链表值错误")
	// 	return
	// }
	// val, err1 := rdb.LRange("id_2", 0, -1).Result()
	// if err1 != nil {
	// 	fmt.Println("获取链表值错误")
	// 	return
	// }
	// fmt.Println(val)

	//集合sadd/smembers操作
	// err1 := rdb.SAdd("id_3", 4, 5, 6, 7).Err()
	// if err1 != nil {
	// 	fmt.Println("设置集合值错误")
	// 	return
	// }
	// val, err1 := rdb.SMembers("id_3").Result()
	// if err1 != nil {
	// 	fmt.Println("获取集合值错误")
	// 	return
	// }
	// fmt.Println(val)

	//有序集合zadd/zrangewithscores操作
	// err1 := rdb.ZAdd("id_4", redis.Z{Member: "yzl", Score: 99.0}, redis.Z{Member: "yyy", Score: 97.0}, redis.Z{Member: "zzz", Score: 90.0}).Err()
	// if err1 != nil {
	// 	fmt.Println("设置有序集合值错误")
	// 	return
	// }
	// val, err1 := rdb.ZRangeWithScores("id_4", 0, -1).Result()
	// if err1 != nil {
	// 	fmt.Println("获取有序集合值错误")
	// 	return
	// }
	// fmt.Println(val)
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值