在 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 子句。