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

时间:2015-05-09 12:43:45

标签: sqlite go

我是新手,试图从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检索数据作为单行,也没有返回任何结果。

非常感谢任何帮助。

更新: 我补充道     如果rows.Next()== false

试图找到问题。删除它会产生相同的结果。此外,我没有从扫描中收到错误消息。 for rows.next()循环甚至不会被执行。

2 个答案:

答案 0 :(得分:2)

当你这样做时:

 int    puts(char *s);

 section .data
    nl db 10
    null_msg db "(null)", 10

 section .text
    global _ft_puts

 _ft_puts:
 mov        rax, rdi
 cmp        rdi, 0
 jz     nul
 xor        r9, r9
 jmp        len

len:
   cmp      byte[rdi + r9], 0
   jz       write
   inc      r9
   jmp      len

write:
   mov      rax, 0x2000004
   mov      rsi, rdi
   mov      rdi, 1
   mov      rdx, r9
   syscall
   mov      rax, 0x2000004
   lea      rsi, [rel nl]
   mov      rdi, 1
   mov      rdx, 1
   syscall
   jmp      return

nul:
   mov      rax, 0x2000004
   mov      rdi, 1
   lea      rsi, [rel null_msg]
   mov      rdx, 7
   syscall
   jmp      return

return:
   mov      rax, 1
   ret

您正在滚动到第一行

if rows.Next() == false

移至下一行

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

另外,您忽略了扫描中的错误。

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

答案 1 :(得分:0)

好的我弄清楚问题是什么:

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

我觉得很奇怪,允许这种行为从go或sqlite返回没有错误,甚至在你打印出查询并手动使用sqlite3时也能正常工作。来自C并刚刚开始,这显然是令人头疼的原因。