Kok*_*zzu 4 sql prepared-statement go where-in sql-like
在阅读了很多教程之后,我发现有很多方法可以在Go中的预准备语句中绑定参数,其中一些是
SELECT * FROM bla WHERE x = ?col1 AND y = ?col2
SELECT * FROM bla WHERE x = ? AND y = ?
SELECT * FROM bla WHERE x = :col1 AND y = :col2
SELECT * FROM bla WHERE x = $1 AND y = $2
Run Code Online (Sandbox Code Playgroud)
第一个问题,绑定参数的跨数据库方式是什么?(适用于任何数据库)
第二个问题,我没有读过关于LIKE语句的教程,如何LIKE正确绑定-statement的参数?
SELECT * FROM bla WHERE x LIKE /*WHAT?*/
Run Code Online (Sandbox Code Playgroud)
第三个问题,也没有给出IN语句的例子,如何IN正确绑定语句的参数?
`SELECT * FROM bla WHERE x IN ( /*WHAT?*/ )
Run Code Online (Sandbox Code Playgroud)
绑定参数的跨数据库方式是什么?
使用database/sql,没有.每个数据库都有自己的方式来表示参数占位符.Go数据库/ sql包不为预准备语句提供任何规范化工具.准备好的语句文本只是传递给底层驱动程序,驱动程序通常只是将它们未修改地发送到数据库服务器(或嵌入式数据库的库).
如何正确绑定LIKE语句的参数?
您可以在like语句后使用参数占位符并将其绑定为字符串.例如,您可以将预备语句编写为:
SELECT a from bla WHERE b LIKE ?
Run Code Online (Sandbox Code Playgroud)
这是一个示例(省略了错误管理处理).
package main
import (
"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 = %s\n", a)
}
Run Code Online (Sandbox Code Playgroud)
请注意,%字符是绑定字符串的一部分,而不是查询文本的一部分.
如何正确绑定IN语句的参数?
我所知道的数据库都不允许直接用IN子句绑定参数列表.这不是数据库/ sql或驱动程序的限制,但大多数数据库服务器都不支持这一点.
您有几种解决问题的方法:
您可以在IN子句中使用固定数量的占位符构建查询.仅绑定您提供的参数,并通过NULL值完成其他占位符.如果您的值多于您选择的固定数字,则只需执行多次查询.这不是非常优雅,但它可以是有效的.
您可以使用不同数量的占位符构建多个查询.IN(?)的一个查询,IN(?,?)的第二个查询,IN(?,?,?)的第三个查询等等...将这些准备好的查询保存在语句缓存中,并选择正确的查询运行时取决于输入参数的数量.请注意,它占用内存,并且通常最大预备语句数是有限的,因此当参数数量很多时不能使用它.
如果输入参数的数量很大,则将它们插入临时表中,并通过与临时表的连接将查询替换为IN子句.如果您设法在一次往返中执行临时表中的插入,则会很有效.使用Go和database/sql,这是不方便的,因为无法批量查询.
这些解决方案中的每一个都有缺点.它们都不是完美的.
| 归档时间: |
|
| 查看次数: |
3990 次 |
| 最近记录: |