[瞎写个 golang 脚本]03-连接 DB 和 redis

325 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情

前言

本瞎写脚本专题主要是记录使用 golang 一些问题和思考,当然也会将一部分隐私的部分屏蔽掉,只给出一小部分的内容。

连接 MySQL

golang 中常用就是 database/sql 包进行数据库操作,其提供了很多轻量级的数据库操作的接口。如下,可以导入驱动包和 mysql 操作库。

"github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"

初始化数据库对象, 通过使用 sqlx.Open 创建一个数据库对象 DB。

func InitMiddleware() {
  database, err := sqlx.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/localtest")
  if err != nil {
    fmt.Println("open mysql failed,", err)
    return
  }
  Db = database
  defer Db.Close() 
}

open 的第一个参数是驱动名称,第二个参数是连接驱动的地址

func Query(db *sqlx.DB) {
  rows, err := db.Query("select * from users")
  if err != nil {
    fmt.Println("查询失败", err)
  }
  for rows.Next() {
    rows.Scan()
    // 将数据加入到数组对象内
  }
}
​
func Create(db *sqlx.DB) {
  result, err := db.Exec("insert into user(name,age)")
  if err != nil {
    fmt.Print("添加失败")
  }
  newId, _ := result.LastInsertId()
  i, _ := result.RowsAffected()
  fmt.Printf("新增的数据ID:%d , 受影响行数:%d \n", newId, i)
}

Query () 函数用来直接执行 Sql 返回 Rows 结果。Exec () 函数用来执行 stmt 准备好的 SQL,其中执行后得到的结果,RowsAffected 是求受影响的行数,LastInsertId是求插入的最后一行 ID

当然,也支持其他类型的数据库,比如 SQLite ,PostgreSQL等。只要下载相关的数据库的驱动,并使用驱动对应的数据库连接地址即可

连接 Redis

同样,也支持 NOSQL 类型的数据库操作 ,比如 Redis,使用 redisgo 驱动。

使用 redisgo 包

创建一个 redis 连接池,使用 chan 方式进行对 redis 操作关闭,当接收到异常,中断等信息时,关闭 redis 连接

func InitRedis() {
  RedisPool = &redis.Pool{
    MaxIdle:     3,
    IdleTimeout: 240 * time.Second,
    Dial: func() (redis.Conn, error) {
      c, err := redis.Dial("tcp", ":6379")
      if err != nil {
        return nil, err
      }
      return c, err
    },
  }
​
  close()
}
​
func close() {
  c := make(chan os.Signal, 1)
  signal.Notify(c, os.Interrupt)
  signal.Notify(c, syscall.SIGTERM)
  signal.Notify(c, syscall.SIGKILL)
​
  go func() {
    <-c
    RedisPool.Close()
    os.Exit(0)
  }()
}
​

还有另外一个包可以进行 redis 操作 gopkg.in/redis.v4

使用 gopkg.in/redis.v4

// 创建 redis 客户端
func createClient() *redis.Client {
    redisClient := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: "123456",
        DB:       0,
    })
​
    // Ping 来检查是否成功连接到了 redis 服务器
    result, err := redisClient.Ping().Result()
    fmt.Println(result, err)
​
    return redisClient
}
​