执行不返回数据的 SQL 语句
当您执行不返回数据的数据库操作时,请使用 database/sql
软件包中的 Exec
或 ExecContext
方法。您将以这种方式执行的 SQL 语句包括 INSERT
、DELETE
和 UPDATE
。
如果您的查询可能会返回行,请改用 Query
或 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
|
用于保留连接。有关更多信息,请参阅 管理连接。 |