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