有没有办法在sqlite中查看将参数应用于查询的结果?

有没有办法在sqlite中查看将参数应用于查询的结果?,sqlite,go,fts5,go-sqlite3,Sqlite,Go,Fts5,Go Sqlite3,我在Go中使用sqlite3,出于调试目的,我希望看到将参数应用到带有替换项的查询的结果,即,带有?替换为实际参数。这可能吗 目前,我有如下代码,打印的FTS5查询看起来不错: SELECT ownerid FROM __ftsindex WHERE ownertable=? AND __ftsindex MATCH ? AND ( __ftsindex MATCH ? ) LIMIT ?; 它不会返回错误,但也找不到应该找到的内容,我不知道如何进一步调试: for i := range t

我在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...)

如果您没有从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)
    }
}
例如:


另外,关于如何呈现模糊的字符串编码和字节片,请参阅这篇精彩文章。

可能不会,因为参数实际上不会被替换。它们连同准备好的查询的名称一起传递给数据库引擎。不过我有个主意。我将使用fmt.Sprintf构造查询进行调试,然后使用适当的?当我发现错误后,我再次进行参数设置。这可能很有用,尤其是在编译sqlite时启用了调试。谢谢!我发现了问题,实际上只是标记化。我希望像“/home/mnt/*”这样的查询可以工作,但默认情况下“/”不是一个标记字符。把每件事都加上引号是有效的。