c语言编程笔录

首页 >   > 笔记大全

笔记大全

关于Go SQL中的Query、Exec和Prepare使用对比(附网络抓包)

更新时间:2024-01-14

前言

在Go语言中,与数据库交互常常使用SQL语句来查询、执行和准备(Prepare)操作。这三种操作的使用场景略有不同,本文将就它们的区别进行详细解析。为了更好地说明示例情况,我们将使用网络抓包来展示每个操作的效果和特点。

Query操作

Query操作用于执行一个查询语句并返回结果集。它通常用于从数据库中获取数据。具体步骤如下:

  1. 创建数据库连接
  2. 创建查询语句
  3. 执行查询语句
  4. 处理结果集
  5. 关闭数据库连接
// 创建数据库连接
db, err := sql.Open("driverName", "dataSourceName")
if err != nil {
    // 错误处理
}

// 创建查询语句
query := "SELECT * FROM users WHERE age > ?"
rows, err := db.Query(query, 18)
if err != nil {
    // 错误处理
}

defer rows.Close()

// 处理结果集
for rows.Next() {
    // 读取数据
}

// 关闭数据库连接
db.Close()

Query操作返回一个*sql.Rows对象,该对象表示结果集。我们可以使用Next方法迭代每一行数据,并用Scan方法将数据存入对应的变量中。

Exec操作

Exec操作用于执行一个非查询语句,例如插入、更新或删除操作,它不返回任何结果集。具体步骤如下:

  1. 创建数据库连接
  2. 创建执行语句
  3. 执行语句
  4. 关闭数据库连接
// 创建数据库连接
db, err := sql.Open("driverName", "dataSourceName")
if err != nil {
    // 错误处理
}

// 创建执行语句
stmt := "UPDATE users SET age = ? WHERE id = ?"
res, err := db.Exec(stmt, 25, 1)
if err != nil {
    // 错误处理
}

// 关闭数据库连接
db.Close()

Exec操作返回一个sql.Result对象,该对象表示影响的行数和最后插入的ID(如果有)等信息。

Prepare操作

Prepare操作用于预处理一个语句(通常是查询语句),以便稍后多次执行。它可以提高性能,尤其在重复执行相同语句的情况下。具体步骤如下:

  1. 创建数据库连接
  2. 创建预处理语句
  3. 执行预处理语句
  4. 关闭预处理语句
  5. 关闭数据库连接
// 创建数据库连接
db, err := sql.Open("driverName", "dataSourceName")
if err != nil {
    // 错误处理
}

// 创建预处理语句
stmt, err := db.Prepare("SELECT * FROM users WHERE age > ?")
if err != nil {
    // 错误处理
}

defer stmt.Close()

// 执行预处理语句
rows, err := stmt.Query(18)
if err != nil {
    // 错误处理
}

defer rows.Close()

// 处理结果集
for rows.Next() {
    // 读取数据
}

// 关闭数据库连接
db.Close()

Prepare操作返回一个*sql.Stmt对象,该对象代表了预处理语句。我们可以多次调用该对象的Query方法来执行预处理语句并处理结果集。

总结

在Go语言中,Query操作用于执行查询并返回结果集,Exec操作用于执行非查询语句,而Prepare操作用于预处理查询语句以提高性能。它们分别返回不同的对象并在使用过程中需要注意关闭连接、释放资源等。