gin-day2

85 阅读2分钟

连接mysql

增删改查

package main

import (
   "database/sql"
   "fmt"
   _"github.com/go-sql-driver/mysql"//匿名导入
   "time"
)

var db *sql.DB
type user struct {
   id   int
   age  int
   name string
}

func initMysql() (err error) {
   dsn := "root:hitlk@tcp(10.249.145.151:3306)/bjpowernode"
   //初始化全局的db对象,而不是新声明一个db变量
   db,err = sql.Open("mysql",dsn)//数据库名称  只是用来校验参数格式是不是正确,实际上并不常见链接,整整链接pig
   if err != nil{
      panic(err)
   }
   //尝试连接
   err = db.Ping()
   if err!=nil{
      fmt.Printf("connect to db failed,err:%v",err)
      return
   }
   //数值需要根据业务具体情况来定
   db.SetConnMaxLifetime(time.Second*10)
   db.SetMaxIdleConns(100)//最大连接数
   db.SetMaxIdleConns(10)//最大空闲连接数
   return
}
// 查询单条数据示例
func queryRowDemo() {
   sqlStr := "select id, name, age from user where id=?"
   var u user
   // 非常重要:确保QueryRow之后调用Scan方法,否则持有的数据库链接不会被释放
   //先读出一行,然后扫描出来给变量
   row := db.QueryRow(sqlStr, 1)//没有对其scan,持有的链接没有释放
   //row = db.QueryRow(sqlStr, 2)
   err := row.Scan(&u.id, &u.name, &u.age)
   if err != nil {
      fmt.Printf("scan failed, err:%v\n", err)
      return
   }
   fmt.Printf("id:%d name:%s age:%d\n", u.id, u.name, u.age)
}

// 查询多条数据示例
func queryMultiRowDemo() {
   sqlStr := "select id, name, age from user where id > ?"
   rows, err := db.Query(sqlStr, 0)
   if err != nil {
      fmt.Printf("query failed, err:%v\n", err)
      return
   }
   // 非常重要:关闭rows释放持有的数据库链接
   defer rows.Close()

   // 循环读取结果集中的数据
   for rows.Next() {
      var u user
      err := rows.Scan(&u.id, &u.name, &u.age)
      if err != nil {
         fmt.Printf("scan failed, err:%v\n", err)
         return
      }
      fmt.Printf("id:%d name:%s age:%d\n", u.id, u.name, u.age)
   }
}

// 插入数据
func insertRowDemo() {
   sqlStr := "insert into user(name, age) values (?,?)"
   ret, err := db.Exec(sqlStr, "李凯", 25)
   if err != nil {
      fmt.Printf("insert failed, err:%v\n", err)
      return
   }
   var theID int64
   theID, err = ret.LastInsertId() // 新插入数据的id
   if err != nil {
      fmt.Printf("get lastinsert ID failed, err:%v\n", err)
      return
   }
   fmt.Printf("insert success, the id is %d.\n", theID)
}

// 更新数据
func updateRowDemo() {
   sqlStr := "update user set age=? where id = ?"
   ret, err := db.Exec(sqlStr, 39, 3)
   if err != nil {
      fmt.Printf("update failed, err:%v\n", err)
      return
   }
   n, err := ret.RowsAffected() // 操作影响的行数
   if err != nil {
      fmt.Printf("get RowsAffected failed, err:%v\n", err)
      return
   }
   fmt.Printf("update success, affected rows:%d\n", n)
}

// 删除数据
func deleteRowDemo() {
   sqlStr := "delete from user where id = ?"
   ret, err := db.Exec(sqlStr, 3)
   if err != nil {
      fmt.Printf("delete failed, err:%v\n", err)
      return
   }
   n, err := ret.RowsAffected() // 操作影响的行数
   if err != nil {
      fmt.Printf("get RowsAffected failed, err:%v\n", err)
      return
   }
   fmt.Printf("delete success, affected rows:%d\n", n)
}
func main()  {
   if err:=initMysql();err!=nil{
      fmt.Println()
   }
   //做完错误检查之后,确保db不为nil
   //释放掉数据库连接相关的资源
   defer db.Close()//注意这行代码要写在err下面!!
   fmt.Println("connect to db success!")

   //queryRowDemo()
   //queryMultiRowDemo()
   //insertRowDemo() 插入
   //updateRowDemo()
   deleteRowDemo()


}