• go操作Mysql


    一. Mysql使用

            使用第三方开源mysql库:

    • github.com/go-sql-driver/mysql (mysql驱动)
    • github . com / jmoiron / sqlx (基于mysql驱动的封装)
            命令行输入:
    go get  github . com / go - sql - driver / mysql
    go get github . com / jmoiron / sqlx
    go get 时的问题:
    • 需要保证go环境变量GO111MODULE=on
    • 需要生成go mod文件 在src文件夹下创建一个文件(如:sample-app),使用go mod init sample-app

            链接mysql:

    1. database, err := sqlx.Open("mysql", "root:xxx@tcp(127.0.0.1:3306)/test")
    2. //database, err := sqlx.Open("数据库类型", "用户名:密码@tcp(ip:端口)/数据库名")

            1.1 Insert操作

    1. package main
    2. import (
    3. "fmt"
    4. _ "github.com/go-sql-driver/mysql"
    5. "github.com/jmoiron/sqlx"
    6. )
    7. var Db *sqlx.DB
    8. func init() {
    9. database, err := sqlx.Open("mysql", "root:Root_123@tcp(127.0.0.1:3306)/")
    10. if err != nil {
    11. fmt.Println("open mysql fail", err)
    12. return
    13. }
    14. Db = database
    15. }
    16. func main() {
    17. //创建数据库
    18. _, err := Db.Exec("create database if not exists test")
    19. if err != nil {
    20. fmt.Println("exec fail", err)
    21. return
    22. }
    23. //进入数据库
    24. _, err = Db.Exec("use test")
    25. if err != nil {
    26. fmt.Println("exec fail", err)
    27. return
    28. }
    29. //创建表
    30. _, err = Db.Exec("create table if not exists person(username varchar(64) default \"\", sex varchar(8) default \"man\", email varchar(258))")
    31. if err != nil {
    32. fmt.Println("exec fail", err)
    33. return
    34. }
    35. //往数据库中插入数据
    36. r, err := Db.Exec("insert into person(username, sex, email)value(?, ?, ?)", "stu001", "man", "stu001@qq.com")
    37. if err != nil {
    38. fmt.Println("exec fail", err)
    39. return
    40. }
    41. id, err := r.LastInsertId()
    42. if err != nil {
    43. fmt.Println("exec fail", err)
    44. return
    45. }
    46. fmt.Println("insert succ: ", id)
    47. }

            1.2 select操作

    1. package main
    2. import (
    3. "fmt"
    4. _ "github.com/go-sql-driver/mysql"
    5. "github.com/jmoiron/sqlx"
    6. )
    7. type Person struct {
    8. Id uint32 `db:"userid"`
    9. Name string `db:"username"`
    10. Sex string `db:"sex"`
    11. Email string `db:"email"`
    12. }
    13. var Db *sqlx.DB
    14. func init() {
    15. database, err := sqlx.Open("mysql", "root:Root_123@tcp(127.0.0.1:3306)/")
    16. if err != nil {
    17. fmt.Println("open mysql fail", err)
    18. return
    19. }
    20. Db = database
    21. }
    22. func main() {
    23. //创建数据库
    24. _, err := Db.Exec("create database if not exists test")
    25. if err != nil {
    26. fmt.Println("create database exec fail", err)
    27. return
    28. }
    29. //进入数据库
    30. _, err = Db.Exec("use test")
    31. if err != nil {
    32. fmt.Println("use exec fail", err)
    33. return
    34. }
    35. //创建表
    36. _, err = Db.Exec("create table if not exists person(userid int unsigned primary key, username varchar(64) default \"\", sex varchar(8) default \"man\", email varchar(258))")
    37. if err != nil {
    38. fmt.Println("create table exec fail", err)
    39. return
    40. }
    41. //往数据库中插入数据
    42. //var r sql.Result
    43. for i := 0; i < 5; i++ {
    44. name := fmt.Sprintf("stu%v", i)
    45. email := fmt.Sprintf("stu%v@qq.com", i)
    46. _, err := Db.Exec("insert into person(userid, username, sex, email)value(?, ?, ?, ?)", i, name, "man", email)
    47. if err != nil {
    48. fmt.Println("exec fail", err)
    49. return
    50. }
    51. }
    52. //select 语句
    53. var person []Person
    54. err = Db.Select(&person, "select userid, username, sex, email from person where userid=?", 1)
    55. if err != nil {
    56. fmt.Println("select fail", err)
    57. return
    58. }
    59. fmt.Println("insert succ: ", person)
    60. }

            1.3 Update操作

    test库的person表:

    1. package main
    2. import (
    3. "fmt"
    4. _ "github.com/go-sql-driver/mysql"
    5. "github.com/jmoiron/sqlx"
    6. )
    7. var Db *sqlx.DB
    8. func init() {
    9. database, err := sqlx.Open("mysql", "root:Root_123@tcp(127.0.0.1:3306)/test")
    10. if err != nil {
    11. fmt.Println("open mysql fail", err)
    12. return
    13. }
    14. Db = database
    15. }
    16. func main() {
    17. //update 语句
    18. res, err := Db.Exec("update person set username=? where userid=?", "stu111", 1)
    19. if err != nil {
    20. fmt.Println("exec update fail", err)
    21. return
    22. }
    23. row, err := res.RowsAffected()
    24. if err != nil {
    25. fmt.Println("rows fail, ", err)
    26. }
    27. fmt.Println("update suc: ", row)
    28. }

            运行之后输出结果和表: 

            1.4 Delete操作 

    删除前的表:

    1. package main
    2. import (
    3. "fmt"
    4. _ "github.com/go-sql-driver/mysql"
    5. "github.com/jmoiron/sqlx"
    6. )
    7. var Db *sqlx.DB
    8. func init() {
    9. database, err := sqlx.Open("mysql", "root:Root_123@tcp(127.0.0.1:3306)/test")
    10. if err != nil {
    11. fmt.Println("open mysql fail", err)
    12. return
    13. }
    14. Db = database
    15. }
    16. func main() {
    17. //delete 语句
    18. res, err := Db.Exec("delete from person where userid=?", 1)
    19. if err != nil {
    20. fmt.Println("exec delete fail", err)
    21. return
    22. }
    23. row, err := res.RowsAffected()
    24. if err != nil {
    25. fmt.Println("rows fail, ", err)
    26. }
    27. fmt.Println("update suc: ", row)
    28. }

          运行之后输出结果和表:  

     二. Mysql事务

            Mysql事务特性:

    • 原子性
    • 一致性
    • 隔离性
    • 持久性

            golang Mysql事务应用:

    1. import ("github.com/jmoiron/sqlx")
    2. Db.Begin() //开始事务
    3. Db.Commit() //提交事务
    4. Db.Rollback() //回滚事务

            执行代码前表:

    1. package main
    2. import (
    3. "fmt"
    4. _ "github.com/go-sql-driver/mysql"
    5. "github.com/jmoiron/sqlx"
    6. )
    7. var Db *sqlx.DB
    8. func init() {
    9. database, err := sqlx.Open("mysql", "root:Root_123@tcp(127.0.0.1:3306)/test")
    10. if err != nil {
    11. fmt.Println("open mysql fail", err)
    12. return
    13. }
    14. Db = database
    15. }
    16. func main() {
    17. conn, err := Db.Begin()
    18. if err != nil {
    19. fmt.Println("begin fail")
    20. return
    21. }
    22. r, err := conn.Exec("insert into person(userid, username, sex, email) value(?, ?, ?, ?)", 10, "stu10", "man", "stu10@qq.com")
    23. if err != nil {
    24. fmt.Println("exec insert fail ", err)
    25. conn.Rollback()
    26. return
    27. }
    28. id, err := r.LastInsertId()
    29. if err != nil {
    30. fmt.Println("exec fail ", err)
    31. conn.Rollback()
    32. return
    33. }
    34. fmt.Println("insert succ ", id)
    35. r, err = conn.Exec("insert into person(userid, username, sex, email) value(?, ?, ?, ?)", 20, "stu20", "man", "stu20@qq.com")
    36. if err != nil {
    37. fmt.Println("exec insert fail ", err)
    38. conn.Rollback()
    39. return
    40. }
    41. id, err = r.LastInsertId()
    42. if err != nil {
    43. fmt.Println("exec fail ", err)
    44. conn.Rollback()
    45. return
    46. }
    47. fmt.Println("insert succ ", id)
    48. conn.Commit()
    49. }

             执行代码后输出和表:

     

     

            

  • 相关阅读:
    「问题解决」java web项目打成jar包运行后工具类无法读取模板文件的解决方法
    vscode离线下载对应版本的插件,避免版本兼容问题
    Go学习之旅:包、变量和函数(DAY 1)
    数据结构与算法课后题-第五章(树的基本概念)
    国王游戏NOIP
    A66 STM32_HAL库函数 之 USART通用驱动 -- B -- 所有函数的介绍及使用
    统计数(C++)
    探究 Meme 的金融与社交属性
    二、VUE3项目实战二
    java基于ssm的房屋租赁出租管理系统
  • 原文地址:https://blog.csdn.net/weixin_57023347/article/details/138187950