为了账号安全,请及时绑定邮箱和手机立即绑定

Go/golang sqlite 查询不返回任何行

Go/golang sqlite 查询不返回任何行

Go
人到中年有点甜 2021-10-04 16:52:37
我是新手,试图从 sqlite 数据库中检索数据。我使用 github.com/mattn/go-sqlite3 作为 sqlite 驱动程序。我发送的查询不返回任何结果,即使它应该返回。我尝试了我的程序手动生成的查询,它在我手动使用查询以及通过我的程序发送查询时返回数据。这是我的代码:for index := range Array {id, _ := strconv.Atoi(Array[index])rand.Seed(time.Now().UnixNano())RandomNr := rand.Intn(100)fmt.Printf("index: %d - randomnr: %d  \n", id, RandomNr)rows, errROW := db.Query("SELECT user.id,user.name,stage.link,player.url,player.characterchance,player.chance FROM user,stage,player WHERE user.id = '%d' AND '%d' <= user.chance AND stage.user = user.id AND stage.domain = player.id AND player.chance > 0 ORDER BY player.id ASC \n",id, RandomNr)//.Scan(&idr, &name, &link, &url, &characterchance, &chance)//this is what the finished query looks like and it returns the rows as its supposed to //rows, errROW := db.Query("SELECT user.id,user.name,stage.link,player.url,player.characterchance,player.chance FROM user,stage,player WHERE user.id = '203' AND '33' <= user.chance AND stage.user = user.id AND stage.domain = player.id AND player.chance > 0 ORDER BY player.id ASC")if errROW != nil {    fmt.Println("errROW")    log.Println(errROW)}defer rows.Close()if rows.Next() == false {    fmt.Println("no rows ")}for rows.Next() {    fmt.Println("where are the rows")    var id int    var name string    var link string    var url string    var characterchance int    var chance int    rows.Scan(&id, &name, &link, &url, &characterchance, &chance)    fmt.Println(id,name,link,url,characterchance,chance)}rows.Close()}}此查询可以返回多行和单行。我还尝试通过 QueryRow 作为单行检索数据,但也没有返回任何结果。任何帮助将非常感激。更新:我添加了 if rows.Next() == false作为寻找问题的尝试。删除它会产生相同的结果。此外,我没有从扫描中收到错误消息。for rows.next() 循环甚至不会被执行。
查看完整描述

2 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

当你这样做时:

if rows.Next() == false

您正在滚动到第一行

for rows.Next()

移至下一行

基本上,您正在跳过您提供的示例代码中结果集中的第一行。

此外,您忽略了 Scan 中的错误。

如果查询返回至少 2 行,这看起来会打印一些内容(因为第一行被跳过)


查看完整回答
反对 回复 2021-10-04
?
红糖糍粑

TA贡献1815条经验 获得超6个赞

好的,我想出了问题所在:

在我的查询中,我使用了: %d 作为我的变量的占位符,当我应该使用 $1、$2 等时。使用这个查询会按预期返回结果。

我觉得奇怪的是,允许这种行为不会从 go 或 sqlite 返回任何错误,甚至在您只是打印查询并手动将其与 sqlite3 一起使用时也能工作。来自 C 并且刚开始使用 go 这显然可能是一些头痛的原因。


查看完整回答
反对 回复 2021-10-04
  • 2 回答
  • 0 关注
  • 296 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信