执行不返回数据的SQL语句

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

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

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

​ 当您的查询可能返回行时,请改为使用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( 管理连接)