为了账号安全,请及时绑定邮箱和手机立即绑定

是否可以为多个请求准备一次 SQL 语句?

是否可以为多个请求准备一次 SQL 语句?

Go
守着一只汪 2023-07-26 15:42:12
我有一些 SQL 查询,它们不会根据每个请求而改变(只有它的参数)。因此,不要对每个请求都这样做:func HandleRequest() {    rows, err := db.Query(sqlQuery, params...)    // do something with data}如果对于每个请求我都这样做可以吗:// together with server initializationstmt, err := db.Prepare(sqlQuery)func HandleRequest() {    rows, err := stmt.Query(params...)    // do something with data}
查看完整描述

1 回答

?
繁花如伊

TA贡献2012条经验 获得超12个赞

正如文档所述DB.Prepare()

多个查询或执行可以从返回的语句同时运行。

尽管预准备语句的预期用途不是在多个请求之间共享它们,但并发使用是安全的。主要原因是准备好的语句(可能)在数据库服务器本身中分配资源,并且在调用Close()返回语句的方法之前它不会被释放。所以我建议不要这样做。

典型的用例是,如果您必须使用不同的参数多次运行相同的语句,例如文档中的示例:

projects := []struct {

    mascot  string

    release int

}{

    {"tux", 1991},

    {"duke", 1996},

    {"gopher", 2009},

    {"moby dock", 2013},

}


stmt, err := db.Prepare("INSERT INTO projects(id, mascot, release, category) VALUES( ?, ?, ?, ? )")

if err != nil {

    log.Fatal(err)

}

defer stmt.Close() // Prepared statements take up server resources and should be closed after use.


for id, project := range projects {

    if _, err := stmt.Exec(id+1, project.mascot, project.release, "open source"); err != nil {

        log.Fatal(err)

    }

}


查看完整回答
反对 回复 2023-07-26
  • 1 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信