golang学习条记18——golang 访问 mysql 数据库全解析

打印 上一主题 下一主题

主题 1400|帖子 1400|积分 4200

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x

  • 推荐学习文档

    • golang应用级os框架,接待star
    • golang应用级os框架使用案例,接待star
    • 案例:基于golang开辟的一款超有个性的旅游筹划app经历
    • golang实战大纲
    • golang优秀开辟常用开源库汇总
    • 想学习更多golang知识,这里有免费的golang学习条记专栏


  
在现代软件开辟中,数据存储和访问是至关紧张的环节。MySQL 作为一款流行的关系型数据库,经常须要与各种编程语言举行交互。Golang 以其高效、简洁的特性,在数据库访问方面也有着精彩的表现。本文将详细介绍 Golang 怎样访问 MySQL 数据库,并共同代码示例举行分析。
准备工作

1.安装 MySQL 驱动



  • 在 Golang 中,要访问 MySQL 数据库,首先须要安装相应的数据库驱动。Go - SQL - Driver 是一个广泛使用的 MySQL 驱动,我们可以使用go get下令来安装它:
  1.      go get -u github.com/go - sql - driver/mysql
复制代码
2.导入须要的包



  • 在 Go 代码中,我们须要导入database/sql包和刚刚安装的 MySQL 驱动包:
  1.      import (
  2.          "database/sql"
  3.          "fmt"
  4.          "github.com/go - sql - driver/mysql"
  5.      )
复制代码
建立数据库连接

1.连接字符串



  • 连接 MySQL 数据库须要构建一个连接字符串,它包含了数据库的相干信息,如用户名、密码、主机地址、端标语和数据库名等。连接字符串的格式如下:
  1.      user:password@tcp(127.0.0.1:3306)/your_database?charset=utf8mb4&parseTime=True&loc=Local
复制代码


  • 其中,user是 MySQL 的用户名,password是对应的密码,tcp(127.0.0.1:3306)表现数据库的主机地址(这里是本地地址和默认端口),your_database是要连接的数据库名称,charset=utf8mb4指定字符集,parseTime=True用于自动解析时间类型,loc = Local设置时区。
2.建立连接



  • 使用sql.Open函数来打开一个数据库连接,它返回一个*sql.DB对象和一个可能的错误:
  1.      func main() {
  2.          db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/your_database?charset=utf8mb4&parseTime=True&loc=Local")
  3.          if err!= nil {
  4.              fmt.Println("数据库连接失败:", err)
  5.              return
  6.          }
  7.          defer db.Close()
  8.      }
复制代码


  • 这里的defer db.Close()语句确保在函数竣事时关闭数据库连接,以开释资源。
执行 SQL 查询

1.简单查询示例(查询单条记录)



  • 以下是一个查询数据库中一条记录的示例。假设我们有一个名为users的表,包含id、name和age列:
  1.      func main() {
  2.          // 建立数据库连接
  3.          db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/your_database?charset=utf8mb4&parseTime=True&loc=Local")
  4.          if err!= nil {
  5.              fmt.Println("数据库连接失败:", err)
  6.              return
  7.          }
  8.          defer db.Close()
  9.          // 查询语句
  10.          var name string
  11.          var age int
  12.          err = db.QueryRow("SELECT name, age FROM users WHERE id = 1").Scan(&name, &age)
  13.          if err!= nil {
  14.              fmt.Println("查询失败:", err)
  15.              return
  16.          }
  17.          fmt.Printf("姓名: %s, 年龄: %d\n", name, age)
  18.      }
复制代码


  • 在这个示例中,我们使用QueryRow函数执行查询语句,它返回一个*sql.Row对象。然后使用Scan方法将查询效果映射到我们界说的变量name和age上。
2.查询多条记录



  • 当须要查询多条记录时,我们使用Query函数。以下是一个查询users表中全部记录的示例:
  1.      func main() {
  2.          db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/your_database?charset=utf8mb4&parseTime=True&loc=Local")
  3.          if err!= nil {
  4.              fmt.Println("数据库连接失败:", err)
  5.              return
  6.          }
  7.          defer db.Close()
  8.          rows, err := db.Query("SELECT name, age FROM users")
  9.          if err!= nil {
  10.              fmt.Println("查询失败:", err)
  11.              return
  12.          }
  13.          defer rows.Close()
  14.          for rows.Next() {
  15.              var name string
  16.              var age int
  17.              err = rows.Scan(&name, &age)
  18.              if err!= nil {
  19.                  fmt.Println("扫描结果失败:", err)
  20.                  return
  21.              }
  22.              fmt.Printf("姓名: %s, 年龄: %d\n", name, age)
  23.          }
  24.          if err = rows.Err(); err!= nil {
  25.              fmt.Println("迭代结果集时出错:", err)
  26.          }
  27.      }
复制代码


  • 这里我们首先使用Query函数得到一个*sql.Rows对象,然后使用Next方法遍历效果集,通过Scan方法获取每一行的数据。最后,我们使用rows.Err()检查在遍历过程中是否出现错误。
执行 SQL 更新利用(插入、更新、删除)

1.插入数据示例



  • 假设我们要向users表中插入一条新记录:
  1.      func main() {
  2.          db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/your_database?charset=utf8mb4&parseTime=True&loc=Local")
  3.          if err!= nil {
  4.              fmt.Println("数据库连接失败:", err)
  5.              return
  6.          }
  7.          defer db.Close()
  8.          // 插入语句
  9.          result, err := db.Exec("INSERT INTO users (name, age) VALUES ('John', 25)")
  10.          if err!= nil {
  11.              fmt.Println("插入失败:", err)
  12.              return
  13.          }
  14.          id, err := result.LastInsertId()
  15.          if err!= nil {
  16.              fmt.Println("获取插入的ID失败:", err)
  17.              return
  18.          }
  19.          fmt.Printf("插入成功, 新记录的ID: %d\n", id)
  20.      }
复制代码


  • 在这个示例中,我们使用Exec函数执行插入语句,它返回一个sql.Result对象。我们可以通过LastInsertId方法获取新插入记录的自增 ID。
2.更新数据示例



  • 以下是更新users表中一条记录的示例:
  1.      func main() {
  2.          db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/your_database?charset=utf8mb4&parseTime=True&loc=Local")
  3.          if err!= nil {
  4.              fmt.Println("数据库连接失败:", err)
  5.              return
  6.          }
  7.          defer db.Close()
  8.          // 更新语句
  9.          result, err := db.Exec("UPDATE users SET age = 26 WHERE id = 1")
  10.          if err!= nil {
  11.              fmt.Println("更新失败:", err)
  12.              return
  13.          }
  14.          rowsAffected, err := result.RowsAffected()
  15.          if err!= nil {
  16.              fmt.Println("获取受影响的行数失败:", err)
  17.              return
  18.          }
  19.          fmt.Printf("更新成功, 受影响的行数: %d\n", rowsAffected)
  20.      }
复制代码


  • 这里使用Exec函数执行更新语句,通过RowsAffected方法获取更新利用影响的行数。
3.删除数据示例



  • 假设要删除users表中的一条记录:
  1.      func main() {
  2.          db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/your_database?charset=utf8mb4&parseTime=True&loc=Local")
  3.          if err!= nil {
  4.              fmt.Println("数据库连接失败:", err)
  5.              return
  6.          }
  7.          defer db.Close()
  8.          // 删除语句
  9.          result, err := db.Exec("DELETE FROM users WHERE id = 1")
  10.          if err!= nil {
  11.              fmt.Println("删除失败:", err)
  12.              return
  13.          }
  14.          rowsAffected, err := result.RowsAffected()
  15.          if err!= nil {
  16.              fmt.Println("获取受影响的行数失败:", err)
  17.              return
  18.          }
  19.          fmt.Printf("删除成功, 受影响的行数: %d\n", rowsAffected)
  20.      }
复制代码


  • 同样使用Exec函数执行删除语句,并通过RowsAffected方法获取受影响的行数。
事件处理

1.事件的概念



  • 事件是一组数据库利用,这些利用要么全部乐成执行,要么全部失败回滚。在 Golang 中,我们可以方便地使用Begin、Commit和Rollback方法来处理事件。
2.示例代码



  • 以下是一个事件处理的示例,假设我们要向users表中插入两条记录,假如其中一条插入失败,则回滚整个利用:
  1.      func main() {
  2.          db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/your_database?charset=utf8mb4&parseTime=True&loc=Local")
  3.          if err!= nil {
  4.              fmt.Println("数据库连接失败:", err)
  5.              return
  6.          }
  7.          defer db.Close()
  8.          tx, err := db.Begin()
  9.          if err!= nil {
  10.              fmt.Println("开始事务失败:", err)
  11.              return
  12.          }
  13.          // 插入第一条记录
  14.          _, err = tx.Exec("INSERT INTO users (name, age) VALUES ('Alice', 22)")
  15.          if err!= nil {
  16.              // 如果插入失败,回滚事务
  17.              tx.Rollback()
  18.              fmt.Println("插入第一条记录失败:", err)
  19.              return
  20.          }
  21.          // 插入第二条记录
  22.          _, err = tx.Exec("INSERT INTO users (name, age) VALUES ('Bob', 23)")
  23.          if err!= nil {
  24.              // 如果插入失败,回滚事务
  25.              tx.Rollback()
  26.              fmt.Println("插入第二条记录失败:", err)
  27.              return
  28.          }
  29.          // 提交事务
  30.          tx.Commit()
  31.          fmt.Println("两条记录插入成功")
  32.      }
复制代码


  • 在这个示例中,我们首先使用Begin方法开始一个事件,得到一个*sql.Tx对象。然后执行两条插入语句,假如其中任何一条出现错误,我们使用Rollback方法回滚事件。假如两条插入语句都乐成执行,我们使用Commit方法提交事件。
通过以上步骤,我们可以在 Golang 中有效地访问 MySQL 数据库,举行各种查询和利用。在现实应用中,我们可以根据详细的业务需求机动运用这些方法,构建强盛而高效的数据库应用程序。
关注我看更多有意思的文章哦
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

梦应逍遥

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表