执行不返回数据的 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 用于保留连接。有关更多信息,请参阅 管理连接