执行不返回数据的 SQL 语句
执行不返回数据的数据库操作时,请使用database/sql
包中的 Exec
或
ExecContext
方法。以这种方式执行的 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
|
用于保留连接。有关更多信息,请参阅 管理连接. |