ToB企服应用市场:ToB评测及商务社交产业平台

标题: Go 连接 MySQL之 MySQL 预处理 [打印本页]

作者: 络腮胡菲菲    时间: 2023-6-11 17:36
标题: Go 连接 MySQL之 MySQL 预处理
Go 连接 MySQL之 MySQL 预处理

一、ChatGPT 关于 MySQL 预处理 的回答

问:什么是MySQL 的预处理 具体执行过程时什么

ChatGPT 答:

MySQL的预处理是一种在执行SQL语句之前,先进行编译和优化的机制。它将SQL语句分成两个阶段:预处理阶段和执行阶段。
具体的执行过程如下:
预处理的好处包括:
总结而言,MySQL的预处理是一种提前编译和优化SQL语句的机制,它将SQL语句分为预处理和执行两个阶段,提高了执行效率和安全性,并简化了参数处理过程。
问:Go实现MySQL预处理

ChatGPT 答:

在 Go 中,可以使用官方提供的 database/sql 包来实现 MySQL 的预处理。下面是一个示例代码,展示了如何在 Go 中进行 MySQL 预处理:
  1. import (
  2.         "database/sql"
  3.         "fmt"
  4.         "log"
  5.         _ "github.com/go-sql-driver/mysql"
  6. )
  7. func main() {
  8.         db, err := sql.Open("mysql", "username:password@tcp(hostname:port)/database")
  9.         if err != nil {
  10.                 log.Fatal(err)
  11.         }
  12.         defer db.Close()
  13.         // 准备预处理语句
  14.         stmt, err := db.Prepare("INSERT INTO users (name, age) VALUES (?, ?)")
  15.         if err != nil {
  16.                 log.Fatal(err)
  17.         }
  18.         defer stmt.Close()
  19.         // 执行预处理语句
  20.         name := "John"
  21.         age := 30
  22.         _, err = stmt.Exec(name, age)
  23.         if err != nil {
  24.                 log.Fatal(err)
  25.         }
  26.         fmt.Println("Insert successful!")
  27. }
复制代码
在上述代码中,我们使用 sql.Open 函数建立与 MySQL 数据库的连接。然后使用 db.Prepare 函数准备预处理语句,其中 SQL 语句中的参数位置用占位符 ? 表示。接下来,通过 stmt.Exec 函数执行预处理语句,并传入具体的参数值。最后,我们在 main 函数中进行了错误处理,并打印了插入成功的消息。
请确保在代码中填入正确的 MySQL 连接信息(用户名、密码、主机名、端口号和数据库名),以便与目标数据库建立连接。同时,请根据实际的预处理语句和参数进行适当的修改。
注意:上述示例代码仅演示了预处理的基本流程,并没有包含完整的错误处理和其他功能。在实际应用中,建议加入适当的错误处理、事务处理等机制,以确保代码的健壮性和安全性。
问:MySQL预处理适用于什么场景?

ChatGPT 答:

MySQL预处理适用于以下场景:
总结而言,MySQL预处理适用于需要执行重复查询、参数化查询、提高性能和简化参数处理的场景。它可以减少服务器的工作量,提高查询的安全性和性能,并简化代码的编写和维护。
二、Go 实现 MySQL 预处理

查询
  1. package main
  2. import (
  3.         "database/sql"
  4.         "fmt"
  5.         "time"
  6.         _ "github.com/go-sql-driver/mysql" // 匿名导入 自动执行 init()
  7. )
  8. var db *sql.DB
  9. func initMySQL() (err error) {
  10.         //DSN (Data Source Name)
  11.         dsn := "root:12345678@tcp(127.0.0.1:3306)/sql_test"
  12.         // 注意:要初始化全局的 db 对象,不要新声明一个 db 变量
  13.         db, err = sql.Open("mysql", dsn) // 只对格式进行校验,并不会真正连接数据库
  14.         if err != nil {
  15.                 return err
  16.         }
  17.         // Ping 验证与数据库的连接是否仍处于活动状态,并在必要时建立连接。
  18.         err = db.Ping()
  19.         if err != nil {
  20.                 fmt.Printf("connect to db failed, err: %v\n", err)
  21.                 return err
  22.         }
  23.         // 数值需要根据业务具体情况来确定
  24.         db.SetConnMaxLifetime(time.Second * 10) // 设置可以重用连接的最长时间
  25.         db.SetConnMaxIdleTime(time.Second * 5)  // 设置连接可能处于空闲状态的最长时间
  26.         db.SetMaxOpenConns(200)                 // 设置与数据库的最大打开连接数
  27.         db.SetMaxIdleConns(10)                  //  设置空闲连接池中的最大连接数
  28.         return nil
  29. }
  30. type user struct {
  31.         id   int
  32.         age  int
  33.         name string
  34. }
  35. // 预处理查询
  36. func prepareQueryDemo(id int) {
  37.         sqlStr := "SELECT id, name, age FROM user WHERE id > ?"
  38.         stmt, err := db.Prepare(sqlStr)
  39.         if err != nil {
  40.                 fmt.Printf("prepare failed, err: %v\n", err)
  41.                 return
  42.         }
  43.         defer stmt.Close()
  44.         rows, err := stmt.Query(id)
  45.         if err != nil {
  46.                 fmt.Printf("query failed, err: %v\n", err)
  47.                 return
  48.         }
  49.         defer rows.Close()
  50.         // 循环读取结果集中的数据
  51.         for rows.Next() {
  52.                 var u user
  53.                 err := rows.Scan(&u.id, &u.name, &u.age)
  54.                 if err != nil {
  55.                         fmt.Printf("scan failed, err: %v\n", err)
  56.                         return
  57.                 }
  58.                 fmt.Printf("id: %d name: %s age: %d\n", u.id, u.name, u.age)
  59.         }
  60. }
  61. func main() {
  62.         if err := initMySQL(); err != nil {
  63.                 fmt.Printf("connect to db failed, err: %v\n", err)
  64.         }
  65.         // 检查完错误之后执行,确保 db 不为 nil
  66.         // Close() 用来释放数据库连接相关的资源
  67.         // Close 将关闭数据库并阻止启动新查询。关闭,然后等待服务器上已开始处理的所有查询完成。
  68.         defer db.Close()
  69.         fmt.Println("connect to database success")
  70.         // db.xx() 去使用数据库操作...
  71.         // MySQL预处理查询多行数据
  72.         prepareQueryDemo(0)
  73. }
复制代码
运行

[code]Code/go/mysql_demo via
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4