执行不返回数据的 SQL 语句

执行不返回数据的数据库操作时,请使用database/sql 包中的 ExecExecContext方法。以这种方式执行的 SQL 语句包括 INSERT, DELETE, 和 UPDATE.

当查询可能返回行时,请改用Query or QueryContext方法。有关详细信息,请参阅查询数据库

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 用于保留连接。有关更多信息,请参阅 管理连接.