执行不返回数据的SQL语句

Executing SQL statements that don’t return data - 执行不返回数据的SQL语句

原文:https://go.dev/doc/database/change-data

​ 当你执行不返回数据的数据库操作时,使用database/sql包中的ExecExecContext方法。你可以通过这种方式执行的SQL语句包括INSERTDELETEUPDATE

​ 当你的查询可能会返回行时,请改用QueryQueryContext方法。更多信息,请参阅Querying a database (查询数据库)

ExecContext方法与Exec方法的工作方式相同,但有一个额外的context.Context实参,如Canceling in-progress operations (取消正在进行的操作)中所述。

​ 以下示例代码使用DB.Exec执行一条语句,将一张新的专辑添加到album(专辑)表中。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
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和驱动程序而异。例如,Postgrespq driver需要像$1这样的占位符,而不是?

​ 如果你的代码将重复执行相同的SQL语句,请考虑使用sql.Stmt从SQL语句创建一个可重用的预处理语句。更多信息,请参阅Using prepared statements(使用预处理语句)

警告:不要使用字符串格式化函数(如fmt.Sprintf)来组装SQL语句!你可能会引入SQL注入的风险。更多信息,请参阅Avoiding SQL injection risk(避免SQL注入风险)

用于执行不返回行的SQL语句的函数

Function 函数Description 描述
DB.Exec DB.ExecContext单独执行一条 SQL 语句。
Tx.Exec Tx.ExecContext在较大的事务中执行 SQL 语句。有关详细信息,请参阅请参阅Executing transactions (执行事务)
Stmt.Exec Stmt.ExecContext执行一个预处理SQL语句。更多信息,请参见 Using prepared statements(使用预处理语句)
Conn.ExecContext用于保留连接。更多信息,请参见Managing connections( 管理连接)
最后修改 October 27, 2023: 更新 (d5ede1a)