用的是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)
}