栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Golang中跨数据库的准备好的语句绑定(如和在何处)

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Golang中跨数据库的准备好的语句绑定(如和在何处)

跨数据库绑定参数的方式是什么?

对于数据库/ sql,没有任何内容。每个数据库都有其表示参数占位符的方式。Go数据库/
sql程序包不为准备好的语句提供任何规范化工具。准备好的语句文本只是传递给基础驱动程序,而驱动程序通常只是将它们未经修改地发送到数据库服务器(或嵌入式数据库的库)。

如何正确绑定LIKE语句的参数?

您可以在like语句之后使用参数占位符,并将其绑定为字符串。例如,您可以将准备好的语句编写为:

SELECt a from bla WHERe b LIKE ?

这是一个示例(省略了错误管理处理)。

package mainimport (    "database/sql"    "fmt"    _ "github.com/go-sql-driver/mysql")// > select * from bla ;// +------+------+// | a    | b    |// +------+------+// | toto | titi |// | bobo | bibi |// +------+------+func main() {    // Open connection    db, err := sql.Open("mysql", "root:XXXXXXX@/test")    if err != nil {         panic(err.Error())  // proper error handling instead of panic in your app    }    defer db.Close()    // Prepare statement for reading data    stmtOut, err := db.Prepare("SELECt a FROM bla WHERe b LIKE ?")    if err != nil {        panic(err.Error()) // proper error handling instead of panic in your app    }    defer stmtOut.Close()    var a string    b := "bi%"    // LIKE 'bi%'    err = stmtOut.QueryRow(b).Scan(&a)    if err != nil {        panic(err.Error()) // proper error handling instead of panic in your app    }    fmt.Printf("a = %sn", a)}

请注意,%字符是绑定字符串的一部分,而不是查询文本的一部分。

如何正确绑定IN语句的参数?

我知道没有一个数据库允许直接使用IN子句绑定参数列表。这不是数据库/ sql或驱动程序的限制,但是大多数数据库服务器都不支持。

您可以通过多种方法来解决此问题:

  • 您可以在IN子句中使用固定数量的占位符构建查询。仅绑定提供的参数,并使用NULL值完成其他占位符。如果您的值多于所选的固定数,则只需多次执行查询。这不是非常优雅,但是可以有效。

  • 您可以使用不同数量的占位符构建多个查询。一个查询IN(?),第二个查询IN(?,?),第三个查询IN(?,?,?),等等……将准备好的查询保留在语句高速缓存中,然后在以下位置选择正确的查询:运行时间取决于输入参数的数量。请注意,它占用内存,并且通常最大的预备语句数量是有限的,因此当参数数量很大时就不能使用它。

  • 如果输入参数的数量很大,则将它们插入临时表中,然后用与临时表的联接将查询替换为IN子句。如果您在一次往返中设法在临时表中执行插入,则非常有效。使用Go和数据库/ sql,这很不方便,因为无法批量查询。

这些解决方案中的每一个都有缺点。他们都不是完美的。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/426938.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号