连接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()
}