执行不返回数据的 SQL 语句

当您执行不返回数据的数据库操作时,请使用 database/sql 包中的 ExecExecContext 方法。您通过这种方式执行的 SQL 语句包括 INSERTDELETEUPDATE

当您的查询可能返回行时,请改用 QueryQueryContext 方法。欲了解更多信息,请参阅查询数据库

ExecContext 方法与 Exec 方法的作用相同,但额外包含一个 context.Context 参数,如取消进行中的操作中所述。

以下示例中的代码使用 DB.Exec 执行语句,将新的唱片专辑添加到 album 表中。

func AddAlbum(alb Album) (int64, error) {
    result, err := db.Exec("INSERT INTO album (title, artist) VALUES (?, ?)", alb.Title, alb.Artist)
    if err != nil {
        return 0, fmt.Errorf("AddAlbum: %v", err)
    }

    // Get the new album's generated ID for the client.
    id, err := result.LastInsertId()
    if err != nil {
        return 0, fmt.Errorf("AddAlbum: %v", err)
    }
    // Return the new album's ID.
    return id, nil
}

DB.Exec 返回值:一个 sql.Result 和一个错误。当错误为 nil 时,您可以使用 Result 获取最后插入项的 ID(如示例所示)或检索受操作影响的行数。

注意: 预处理语句中的参数占位符因您使用的 DBMS 和驱动程序而异。例如,Postgres 的 pq 驱动程序需要像 $1 这样的占位符,而不是 ?

如果您的代码将重复执行相同的 SQL 语句,请考虑使用 sql.Stmt 从 SQL 语句创建可重用的预处理语句。欲了解更多信息,请参阅使用预处理语句

注意: 不要使用字符串格式化函数(如 fmt.Sprintf)来组装 SQL 语句!您可能会引入 SQL 注入风险。欲了解更多信息,请参阅避免 SQL 注入风险

用于执行不返回行的 SQL 语句的函数

函数 描述
DB.Exec
DB.ExecContext
单独执行单个 SQL 语句。
Tx.Exec
Tx.ExecContext
在更大的事务中执行 SQL 语句。欲了解更多信息,请参阅执行事务
Stmt.Exec
Stmt.ExecContext
执行已预处理的 SQL 语句。欲了解更多信息,请参阅使用预处理语句
Conn.ExecContext 用于保留连接。有关更多信息,请参阅管理连接