登录
首页 >  Golang >  Go问答

在 Go 中使用预准备语句进行 SQL 查询错误

来源:stackoverflow

时间:2024-04-02 14:54:33 372浏览 收藏

学习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  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 查询错误》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>