在 golang 中参数化 SQL 子查询
parameterizing SQL subquery in golang
请考虑这个问题。
我需要在 golang 中参数化 SQL(子)查询。请考虑下面或 https://go.dev/play/p/F-jZGEiDnsd
处的伪代码
hayStack
详细信息以字符串切片 lookIn
的形式出现,并且可能会有所不同。我需要在所有这些干草堆中搜索 %eedl%
(针)。
评论中的代码是我目前的处理方式——我只参数化了我正在寻找的needle
。
如何参数化 hayStacks
?
package main
import "fmt"
func main() {
fmt.Println("Hello, 世界")
lookIn := []string{"hayStack.1", "hayStack.2", "hayStack.3", "hayStack.4", "hayStack.5"}
needle := "eedl"
needle = "%" + needle + "%"
for i := range lookIn {
fmt.Println("lookIn", lookIn[i])
}
fmt.Println("needle", needle)
/* this is how I currently do
txt := `select needle,tagTitle,Epoch from ( select needle,tagTitle,Epoch where hayStackName = "hayStack.1" or hayStackName = "hayStack.2" or hayStackName = "hayStack.3" or hayStackName = "hayStack.3" or hayStackName = "hayStack.4" or hayStackName = "hayStack.5" ) where tagTitle like ? order by tagTitle COLLATE NOCASE ASC ;`
rows, err := sqliteDbPtr.Query(txt, needle)
if err != nil {
if err != sql.ErrNoRows {
checkErr(err)
panic(err)
}
return
}
defer rows.Close()
*/
}
任何输入将不胜感激。
仅使用标准库,您可以将 haystack 参数和 needle 参数收集到单个切片中,然后将其传递给 Query
方法。
对于 SQL 本身,您可以使用 IN
运算符并根据干草堆的数量将其右侧操作数生成为 ?
列表。
args := make([]interface{}, len(lookIn)+1) // slice of all args
inRHS := "" // string of ?,... for the IN operator's right hand side
for i := range lookIn {
args[i] = lookIn[i]
inRHS += "?,"
}
args[len(args)-1] = needle // add the last arg
inRHS = inRHS[:len(inRHS)-1] // remove last ","
query := `SELECT needle,tagTitle,Epoch
FROM some_table
WHERE hayStackName IN (` + inRHS + `)
AND tagTitle LIKE ?
ORDER BY tagTitle COLLATE NOCASE ASC`
rows, err := sqliteDbPtr.Query(query, args...)
if err != nil {
// handle error
}
defer rows.Close()
for rows.Next() {
//
}
if err := rows.Err(); err != nil {
//
}
请注意,我已经删除了子查询并添加了您的问题所缺少的 FROM some_table
子句。
请考虑这个问题。
我需要在 golang 中参数化 SQL(子)查询。请考虑下面或 https://go.dev/play/p/F-jZGEiDnsd
处的伪代码hayStack
详细信息以字符串切片 lookIn
的形式出现,并且可能会有所不同。我需要在所有这些干草堆中搜索 %eedl%
(针)。
评论中的代码是我目前的处理方式——我只参数化了我正在寻找的needle
。
如何参数化 hayStacks
?
package main
import "fmt"
func main() {
fmt.Println("Hello, 世界")
lookIn := []string{"hayStack.1", "hayStack.2", "hayStack.3", "hayStack.4", "hayStack.5"}
needle := "eedl"
needle = "%" + needle + "%"
for i := range lookIn {
fmt.Println("lookIn", lookIn[i])
}
fmt.Println("needle", needle)
/* this is how I currently do
txt := `select needle,tagTitle,Epoch from ( select needle,tagTitle,Epoch where hayStackName = "hayStack.1" or hayStackName = "hayStack.2" or hayStackName = "hayStack.3" or hayStackName = "hayStack.3" or hayStackName = "hayStack.4" or hayStackName = "hayStack.5" ) where tagTitle like ? order by tagTitle COLLATE NOCASE ASC ;`
rows, err := sqliteDbPtr.Query(txt, needle)
if err != nil {
if err != sql.ErrNoRows {
checkErr(err)
panic(err)
}
return
}
defer rows.Close()
*/
}
任何输入将不胜感激。
仅使用标准库,您可以将 haystack 参数和 needle 参数收集到单个切片中,然后将其传递给 Query
方法。
对于 SQL 本身,您可以使用 IN
运算符并根据干草堆的数量将其右侧操作数生成为 ?
列表。
args := make([]interface{}, len(lookIn)+1) // slice of all args
inRHS := "" // string of ?,... for the IN operator's right hand side
for i := range lookIn {
args[i] = lookIn[i]
inRHS += "?,"
}
args[len(args)-1] = needle // add the last arg
inRHS = inRHS[:len(inRHS)-1] // remove last ","
query := `SELECT needle,tagTitle,Epoch
FROM some_table
WHERE hayStackName IN (` + inRHS + `)
AND tagTitle LIKE ?
ORDER BY tagTitle COLLATE NOCASE ASC`
rows, err := sqliteDbPtr.Query(query, args...)
if err != nil {
// handle error
}
defer rows.Close()
for rows.Next() {
//
}
if err := rows.Err(); err != nil {
//
}
请注意,我已经删除了子查询并添加了您的问题所缺少的 FROM some_table
子句。