学习Golang要努力,但是不要急!今天的这篇文章《在 Go 中使用预准备语句进行 SQL 查询错误》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!
问题内容我正在尝试使用准备好的语句来查询 sqlite 文件。这之前工作得很好,但我更改了代码以使其更易于单元测试。为此,我开始使用准备好的语句。但是,我收到“结果集中没有行”的错误,但是当我在文件上手动键入此查询时,它会返回一些内容。
我不太明白这里出了什么问题。我觉得这与我传入的参数有关,但我已经尝试了 stackoverflow 上的所有方法,但没有任何效果
import (
"database/sql"
"database/sql/driver"
_ "github.com/mattn/go-sqlite3"
)
...
type driver struct {
driver *driver.driver
}
...
func gettransactionid(pkg string, db *sql.db) (int, error) {
var id int
fmt.println("package is:", pkg)
fmt.println("db is this:", db)
sqlstatement := `select tid from trans_cmdline where cmdline like '%install ?%' order by tid desc limit 1`
err := db.queryrow(sqlstatement, pkg).scan(&id)
if err != nil {
fmt.println("err:", err)
}
switch err {
case sql.errnorows:
fmt.println("id is this:", id)
fmt.println("no rows were returned:", err)
return 0, err
case nil:
return id, nil
default:
return 0, err
}
}
这些查询针对 centos 和 rhel 计算机上的默认事务 yum db 文件运行。上述代码的输出如下:
Package is: telnet
Db is this: &{0 {/var/lib/yum/history/history-2022-10-14.sqlite 0xc0000ae140} 0 {0 0} [] map[] 0 0 0xc00008e1e0 false map[] map[] 0 0 0 0 <nil> 0 0 0 0 0x52cc80}
Err: sql: no rows in result set
ID is this: 0
No rows were returned: sql: no rows in result set
Error querying for transaction ID: sql: no rows in result set
参数“where like”应该匹配任何包含“install {package_here}”的行,但它似乎没有找到任何行(当它们确实存在时)。
我已经尝试过 stackoverflow 上的大部分内容,阅读了 go sql 的官方文档。到目前为止,没有什么对我有用。
正确答案
替换在 like
的 %...%
中不起作用,尝试构建 sql like
语句
SELECT * FROM 分析 WHERE 注释,如 CONCAT('%',?,'%');
到这里,我们也就讲完了《在 Go 中使用预准备语句进行 SQL 查询错误》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注编程网公众号,带你了解更多关于的知识点!