本文翻译自《Executing SQL statements that don’t return data》。
执行不返回数据的数据库操作时,请使用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)
}
// 获取新插入的这条记录的ID
id, err := result.LastInsertId()
if err != nil {
return 0, fmt.Errorf("AddAlbum: %v", err)
}
// 返回这条新记录的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语句的函数
孤立地执行单个SQL语句。
在较大的事务中执行SQL语句。有关详细信息,请参阅执行事务。
执行已准备好的SQL语句。有关详细信息,请参阅使用准备好的语句。
用于专用的连接。有关详细信息,请参阅管理连接。