当前位置:   article > 正文

GO -操作mysql

GO -操作mysql

数据库的连接

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

 主函数检测是否合法

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

 增删查改函数

  1. type user struct {
  2. id int
  3. name string
  4. age int
  5. } //用来接收扫描的对象
  6. func querymultirow() {
  7. sqlstr := "select * from user where id>?"
  8. rows, err := db.Query(sqlstr, 0)
  9. if err != nil {
  10. fmt.Println("queur faild", err)
  11. return
  12. }
  13. defer rows.Close()
  14. for rows.Next() {
  15. var u user
  16. err := rows.Scan(&u.id, &u.name, &u.age)
  17. if err != nil {
  18. fmt.Println("scan faild", err)
  19. }
  20. fmt.Println(u)
  21. }
  22. } //查询多行
  23. func queryRowdemo() {
  24. sqlstr := "select * from user where id=?"
  25. var u user
  26. //此时这个row 没有调用scan ,那么链接不会释放
  27. //记住query调用完之后,一定调用scan方法
  28. row := db.QueryRow(sqlstr, 1) //每个row 是占用连接的
  29. // 连接没有了,不能再查询了 ,程序阻塞住了
  30. row = db.QueryRow(sqlstr, 2)
  31. err := row.Scan(&u.id, &u.name, &u.age)
  32. if err != nil {
  33. fmt.Println("scan err:", err)
  34. return
  35. }
  36. fmt.Printf("id:%d name:%s age:%d\n", u.id, u.name, u.age)
  37. } //查询单行记录
  38. func insertrowdemo() {
  39. sqlstr := "insert into user(name,age) values(?,?)"
  40. ret, err := db.Exec(sqlstr, "王五", 88)
  41. if err != nil {
  42. fmt.Println("insert err:", err)
  43. }
  44. theid, err := ret.LastInsertId() //新插入的id
  45. if err != nil {
  46. fmt.Println("insert err:", err)
  47. return
  48. }
  49. fmt.Println("insert id:", theid)
  50. } //插入数据
  51. func updaterowdemo() {
  52. sqlstr := "update user set age=? where id=?"
  53. ret, err := db.Exec(sqlstr, 39, 1) //把id为
  54. if err != nil {
  55. fmt.Println("update err:", err)
  56. }
  57. n, err := ret.RowsAffected() //影响的行数
  58. if err != nil {
  59. fmt.Println("update err:", err)
  60. }
  61. fmt.Println("affected:", n)
  62. } //更新数据

事务

  1. func transactiondemo() {
  2. tx, err := db.Begin() //开启事务
  3. if err != nil {
  4. if tx != nil {
  5. tx.Rollback() //回滚
  6. }
  7. fmt.Println("begin err:", err)
  8. return
  9. }
  10. sqlstr := "update user set age=36 where id=?"
  11. ret1, err := tx.Exec(sqlstr, 1)
  12. if err != nil {
  13. tx.Rollback()
  14. fmt.Println("exec err:", err)
  15. return
  16. }
  17. aff1, err := ret1.RowsAffected()
  18. if err != nil {
  19. tx.Rollback()
  20. fmt.Println("RowsAffected", err)
  21. return
  22. }
  23. sqlstr2 := "update user set age=40 where id=?"
  24. ret2, err := tx.Exec(sqlstr2, 2)
  25. if err != nil {
  26. tx.Rollback()
  27. fmt.Println("exec err:", err)
  28. return
  29. }
  30. aff2, err := ret2.RowsAffected()
  31. if err != nil {
  32. tx.Rollback()
  33. fmt.Println("RowsAffected", err)
  34. return
  35. }
  36. fmt.Println(aff1, aff2)
  37. if aff1 == 1 && aff2 == 1 {
  38. err = tx.Commit()
  39. fmt.Println("事务提交啦")
  40. if err != nil {
  41. tx.Rollback()
  42. fmt.Println("commit err:", err)
  43. return
  44. }
  45. } else {
  46. err = tx.Rollback()
  47. fmt.Println("tx.rollback err:回滚啦", err)
  48. }
  49. }

main函数

  1. func main() {
  2. err := initmysql()
  3. if err != nil {
  4. fmt.Println("连接mysql失败")
  5. }
  6. //做完错误检查之后,确保db不为nil
  7. defer db.Close()
  8. fmt.Println("连接数据库mysql") //不能保证连接成功
  9. 查询单行数据
  10. //queryRowdemo()
  11. 查询多行数据
  12. //querymultirow()
  13. 插入一条数据
  14. //insertrowdemo()
  15. //updaterowdemo()
  16. querymultirow()
  17. fmt.Println("查询结束了。。。。")
  18. transactiondemo()
  19. querymultirow()
  20. }

小计:



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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/909475
推荐阅读
相关标签
  

闽ICP备14008679号