0

我在 Go 中使用 sqlite3,出于调试目的,我希望看到将参数应用于查询的结果,即使用 ? 替换为实际参数。这可能吗?

目前,我有如下代码,打印的 FTS5 查询看起来不错:

SELECT ownerid FROM __ftsindex WHERE ownertable=? AND 
__ftsindex MATCH ? AND ( __ftsindex MATCH ? ) LIMIT ?;

它不会返回错误,但也找不到应该找到的内容,而且我不知道如何进一步调试:

for i := range trails {
    if i == 0 {
        s += `( __ftsindex MATCH ?`
    } else {
        s += ` OR __ftsindex MATCH ?`
    }
}
s += " )"
query = fmt.Sprintf(`SELECT ownerid FROM __ftsindex WHERE ownertable=? AND __ftsindex MATCH ? AND %s LIMIT ?;`, s)
fmt.Println(query)
args := make([]interface{}, len(trails)+3)
args[0] = cat.Table()
args[1] = searchTerm
for i := range trails {
    args[i+2] = trails[i]
}
args[len(args)-1] = limit
rows, err := model.DB.Base().Query(query, args...)
4

1 回答 1

1

如果您没有从 SQL 查询中获得预期的结果,则您的输入参数中可能存在恶意字节。

我建议使用以下方法记录每个单独的参数%+q

for i, arg := range sqlArgs {
    if _, ok := arg.(string); ok {
        log.Printf("arg %d) %+q\n", i+1, arg) // catches any 'invisible' bytes or visually similar characters
    } else {
        log.Printf("arg %d) `%v`\n", i+1, arg)
    }
}

例如: https: //play.golang.org/p/mDsnIjMAVwP

PS 请参阅这篇出色的 go 博客文章,了解如何呈现晦涩的字符串编码和字节片。

于 2019-07-05T15:41:46.660 回答