GO -操作mysql

数据库的连接

func initmysql() (err error) {
    dsn := "root:0806@tcp(127.0.0.1:3306)/sql_demo" //固定格式
    db, err = sql.Open("mysql", dsn)
    if err != nil {
       panic(err)
    }
    err = db.Ping()
    if err != nil {
       fmt.Println("ping 失败")
       return err
    }
    // 数值需要根据业务情况 决定
    db.SetConnMaxLifetime(time.Second * 10) //10s
    db.SetMaxOpenConns(3)                   //最大连接数
    db.SetMaxIdleConns(1)                   //复用的         //最大空闲连接数
    return

}

 主函数检测是否合法

err := initmysql()
if err != nil {
    fmt.Println("连接mysql失败")
}
//做完错误检查之后,确保db不为nil
defer db.Close()
fmt.Println("连接数据库mysql") //不能保证连接成功

 增删查改函数

type user struct {
	id   int
	name string
	age  int
} //用来接收扫描的对象

func querymultirow() {
	sqlstr := "select * from user where id>?"
	rows, err := db.Query(sqlstr, 0)
	if err != nil {
		fmt.Println("queur faild", err)
		return
	}
	defer rows.Close()
	for rows.Next() {
		var u user
		err := rows.Scan(&u.id, &u.name, &u.age)
		if err != nil {
			fmt.Println("scan faild", err)

		}
		fmt.Println(u)
	}

} //查询多行
func queryRowdemo() {
	sqlstr := "select * from user where id=?"
	var u user
	//此时这个row 没有调用scan ,那么链接不会释放

	//记住query调用完之后,一定调用scan方法

	row := db.QueryRow(sqlstr, 1) //每个row 是占用连接的

	// 连接没有了,不能再查询了  ,程序阻塞住了
	row = db.QueryRow(sqlstr, 2)
	err := row.Scan(&u.id, &u.name, &u.age)
	if err != nil {
		fmt.Println("scan err:", 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, "王五", 88)
	if err != nil {
		fmt.Println("insert err:", err)
	}
	theid, err := ret.LastInsertId() //新插入的id
	if err != nil {
		fmt.Println("insert err:", err)
		return
	}
	fmt.Println("insert id:", theid)

} //插入数据
func updaterowdemo() {
	sqlstr := "update user set age=? where id=?"
	ret, err := db.Exec(sqlstr, 39, 1) //把id为
	if err != nil {
		fmt.Println("update err:", err)
	}
	n, err := ret.RowsAffected() //影响的行数
	if err != nil {
		fmt.Println("update err:", err)
	}
	fmt.Println("affected:", n)
} //更新数据

事务

func transactiondemo() {
	tx, err := db.Begin() //开启事务
	if err != nil {
		if tx != nil {
			tx.Rollback() //回滚
		}
		fmt.Println("begin err:", err)
		return
	}
	sqlstr := "update user set age=36 where id=?"
	ret1, err := tx.Exec(sqlstr, 1)
	if err != nil {
		tx.Rollback()
		fmt.Println("exec err:", err)
		return
	}
	aff1, err := ret1.RowsAffected()
	if err != nil {
		tx.Rollback()
		fmt.Println("RowsAffected", err)
		return
	}

	sqlstr2 := "update user set age=40 where id=?"
	ret2, err := tx.Exec(sqlstr2, 2)
	if err != nil {
		tx.Rollback()
		fmt.Println("exec err:", err)
		return
	}
	aff2, err := ret2.RowsAffected()
	if err != nil {
		tx.Rollback()
		fmt.Println("RowsAffected", err)
		return
	}
	fmt.Println(aff1, aff2)

	if aff1 == 1 && aff2 == 1 {
		err = tx.Commit()
		fmt.Println("事务提交啦")
		if err != nil {
			tx.Rollback()
			fmt.Println("commit err:", err)
			return
		}
	} else {
		err = tx.Rollback()
		fmt.Println("tx.rollback err:回滚啦", err)
	}

}

main函数

func main() {
	err := initmysql()
	if err != nil {
		fmt.Println("连接mysql失败")
	}
	//做完错误检查之后,确保db不为nil
	defer db.Close()
	fmt.Println("连接数据库mysql") //不能保证连接成功
	查询单行数据
	//queryRowdemo()
	查询多行数据
	//querymultirow()
	插入一条数据
	//insertrowdemo()
	//updaterowdemo()
	querymultirow()
	fmt.Println("查询结束了。。。。")
	transactiondemo()
	querymultirow()
}

小计:



//批量执行同一条sql语句,考虑预处理提升性能

//sql注入就是,传参的名字不合法如 “xxx”,不要自己拼接;

// 事务的相关方法 begin()  commit

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值