1.操作redis
外部依赖:
go get github.com/go-redis/redis/v8
1.1 操作代码的代码:
package main
import (
"context"
"encoding/json"
"github.com/go-redis/redis/v8"
"log"
)
var redisClient *redis.Client // Redis 客户端, 用于连接 Redis 服务器
func initRedis() {
ctx := context.Background()
// 连接redis
redisClient = redis.NewClient(&redis.Options{
Addr: "localhost:6379", // Redis 服务器地址
Password: "", // 如果 Redis 设置了密码
DB: 0, // 使用的数据库编号
})
// 验证 Redis 客户端是否可以正常工作
_, err := redisClient.Ping(ctx).Result()
if err != nil {
log.Fatalf("Error connecting to Redis: %v", err)
}
}
func closeRedis() {
// 关闭 Redis 客户端
if err := redisClient.Close(); err != nil {
log.Fatalf("Error closing Redis client: %v", err)
}
}
// 设置redis
func setRedis(key string, value string) {
ctx := context.Background()
err := redisClient.Set(ctx, key, value, 0).Err()
if err != nil {
log.Fatalf("Error setting key: %v", err)
}
}
// 获取redis
func getRedis(key string) string {
ctx := context.Background()
val, err := redisClient.Get(ctx, key).Result() // 从 Redis 读取键值, 如果键不存在则返回空字符串, 如果出现错误则返回错误
if err != nil {
log.Fatalf("Error getting key: %v", err)
}
return val
}
// pop redis list from left
func popRedisList(key string) string {
ctx := context.Background()
val, err := redisClient.LPop(ctx, key).Result() // 从 Redis 读取键值, 如果键不存在则返回空字符串, 如果出现错误则返回错误
if err != nil {
log.Fatalf("Error reading from Redis: %v", err)
}
return val
}
// push redis list from right
func pushRedisList(key string, value string) {
ctx := context.Background()
err := redisClient.RPush(ctx, key, value).Err()
if err != nil {
log.Fatalf("Error setting key: %v", err)
}
}
// delete redis key
func delRedis(key string) {
ctx := context.Background()
err := redisClient.Del(ctx, key).Err()
if err != nil {
log.Fatalf("Error setting key: %v", err)
}
}
// User 用户,用于存入 Redis hash
type RUser struct {
ID int `json:"id"`
Name string `json:"name"`
Age int `json:"age"`
Email string `json:"email"`
}
func (u *RUser) toJSONString() string {
// 将User对象编码为JSON字符串
userJSON, err := json.Marshal(u)
if err != nil {
log.Fatalf("Failed to marshal user: %v", err)
}
return string(userJSON)
}
// put hash to redis
func hSetRedis(key string, field string, value string) {
ctx := context.Background()
err := redisClient.HSet(ctx, key, field, value).Err()
if err != nil {
log.Fatalf("Error setting key: %v", err)
}
}
// get hash from redis
func hGetRedis(key string, field string) string {
ctx := context.Background()
val, err := redisClient.HGet(ctx, key, field).Result()
if err != nil {
log.Fatalf("Error getting key: %v", err)
}
return val
}
1.2 测试
设置redis的基本测试
user := RUser{ID: 111, Name: "lijun", Age: 18, Email: "haha"}
fmt.Println(user.toJSONString())
fmt.Println("test redis")
initRedis()
key := "user-" + fmt.Sprintf("%d", user.ID)
delRedis(key)
setRedis(key, user.toJSONString())
//将获取到的json解析为RUser对象
val := getRedis(key)
fmt.Println("val=", val)
var user2 RUser
err := json.Unmarshal([]byte(val), &user2)
if err != nil {
fmt.Println("json unmarshal error")
}
fmt.Println("user2=", user2)
closeRedis()
2.GORM
gorm 是一个用 Go 语言编写的,流行的 ORM(Object-Relational Mapping)对象关系映射库。它使得开发者可以使用 Go 结构体(struct)来映射数据库中的表,并允许开发者使用 Go 的方法来操作数据库中的记录,而无需编写原始的 SQL 语句(尽管 gorm 也支持原生 SQL)。
以下是一些 gorm 的基本特点:
- 结构体的自动映射:你可以定义一个 Go 结构体,然后使用 gorm 的标签(tag)来指示这个结构体如何映射到数据库中的表。
- 查询方法:gorm 提供了一套丰富的方法用于查询数据库,包括 Find、First、Last、Take、Where、Order、Limit、Offset 等。
- 关联:gorm 支持多种数据库关联,如 Has One、Has Many、Belongs To、Many To Many 等。
3.GORM操作PostgreSQL
1.导入依赖
gorm.io/driver/postgres v1.5.7
gorm.io/gorm v1.25.10
注意:使用gorm操作的postgres的数据库表结构中gorm会生成其他字段,且自定义的字段首字母为大写,命名为驼峰,除非自定义了与数据库表属性的映射:
type Model struct {
ID uint `gorm:"primarykey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt DeletedAt `gorm:"index"`
}
2.操作代码
package main
import (
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
var db *gorm.DB //数据库连接
// 连接postgresql数据库
func initPostgres() {
//dsn 数据库连接信息
dsn := "host=ip user=postgres dbname=testdb3 password=password port=5432 TimeZone=Asia/Shanghai" // data source name
var err error
db, err = gorm.Open(postgres.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
user := User{} //创建表
db.AutoMigrate(&user) //自动迁移,创建表,如果表已经存在,会自动更新表结构,不会删除表
//查询
//db.First(&user, 3) // 查询id为1的user
//输出查询结果
//findById(1)
//var users []User
//db.Debug().Find(&users)
//for _, user := range users {
// println(user.ID, user.Name, user.Age)
//}
//db.Find(&user, "name = ?", "lijun") // 查询name为D42的user
//fmt.Println("user id=", user.ID)
//fmt.Println("user name=", user.name)
//添加
db.Debug().Create(&User{Name: "hello", Age: 22}) // 创建一个user
////删除
//db.Debug().Delete(&User{}, 2) // 删除id为2的user
//db.Delete(&User{}, "name = ?", "D42") // 删除name为D42的user
//
////更新
//db.Model(&User{}).Where("user_name = ?", "D42").Update("user_age", 18) // 更新name为D42的user的age为18
//db.Model(&User{}).Where("id = ?", "2").Updates(User{name: "abc", age: 18}) // 更新id为2的user的name为abc,age为18,password为123
}
func closePostgres() {
sqlDB, err := db.DB()
if err != nil {
panic("failed to connect database")
}
sqlDB.Close()
}
// 查询
func findAllUsers() []User {
var users []User
db.Find(&users) // 查询所有的users
for _, user := range users {
println(user.ID, user.Name, user.Age)
}
return users
}
// 通过id删除
func deleteById(id int) {
db.Delete(&User{}, id) // 删除id为id的user
}
// 通过name删除
func deleteByName(name string) {
db.Delete(&User{}, "name = ?", name) // 删除name为name的user
}
// 添加记录
func create(name string, age int) {
db.Create(&User{Name: name, Age: age})
}
// 查询
func findUserById(id int) User {
var user User
db.First(&user, id) // 查询id的user,并返回
println(user.ID, user.Name, user.Age)
return user
}
// 通过name查询
func searchByName(name string) {
var user User
db.Find(&user, "name = ?", name) // 查询name为name的user
println(user.ID, user.Name, user.Age)
}
func updateById(id int, name string, age int) {
// 更新id的user的name和age
db.Model(&User{}).Where("id = ?", id).Updates(User{Name: name, Age: age})
}
// 模型
type User struct {
gorm.Model
Name string `gorm:"column:user_name"`
Age int `gorm:"column:user_age"`
}
3.测试代码
部分代码:
fmt.Println("test postgres")
initPostgres()
users := findAllUsers()
for _, user := range users {
fmt.Println(user)
}
closePostgres()
