GO操作Redis、Postgresql等数据库

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()
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇